📌  相关文章
📜  对于给定数组中的 Q 查询,将所有出现的 X 替换为 Y

📅  最后修改于: 2022-05-13 01:56:05.719000             🧑  作者: Mango

对于给定数组中的 Q 查询,将所有出现的 X 替换为 Y

给定一个数组arr[]和一个由查询组成的二维数组query[][] 。对于每个查询q ,将arr[]中所有出现的query[i][0]替换为 query [i][1]

例子:

天真的方法:(蛮力解决方案)天真的方法是遍历 query 的所有查询,并且对于每个query[i][0] ,在arr[]中找到它的所有出现,并将其替换为query[i ][1]

时间复杂度: O(N*Q),其中 N 是 arr[] 的大小,Q 是 query[][] 的大小。
辅助空间: O(1)

有效方法:更好的解决方案是使用 Hashmap,它存储数组中元素的索引。请按照以下步骤解决给定的问题。

  • 初始化一个hashmap = {} ,并用数组元素作为键填充它,并列出它在数组中的位置。
  • 遍历query[][]的每个查询q
    • 如果q[0]存在于hashmap中,
      • 如果q[1]存在于hashmap中,则将q[0]的值扩展为q[1]键的值。
      • 否则,使用 q[0] 键的值将值添加到q[1]键。
      • hashmap中删除 q[0] 的键值对。
  • 现在,从hashmap的值创建一个新的变量map = {}
  • 交换键值对,使map包含键值对作为索引,以及hashmap的键值。
  • 使用此映射,我们现在可以通过使用映射中的值更新arr的每个位置的值来更新原始数组arr

下面是上述方法的实现:

C++
// C++ program for above approach
#include 
using namespace std;
 
// Function to replace all the
// occurrences of a number with
// another given number for Q queries
void update(vector& A, int N, vector >& Q)
{
   
    // Creating a hashmap
    map > hashmap;
    for (int i = 0; i < N; ++i) {
        hashmap[A[i]].push_back(i);
    }
 
    // Iterating with q in given queries
    for (auto q : Q) {
        if (hashmap.count(q[0])) {
            if (hashmap.count(q[1]))
                hashmap[q[1]].insert(hashmap[q[1]].end(),
                                     hashmap[q[0]].begin(),
                                     hashmap[q[0]].end());
            else
                hashmap[q[1]] = hashmap[q[0]];
            hashmap.erase(q[0]);
        }
    }
 
    // Creating map to store key value pairs
    map new_map;
    for (auto it = hashmap.begin(); it != hashmap.end();
         ++it) {
        for (auto index : it->second)
            new_map[index] = it->first;
    }
 
    // Updating the main array with final values
    for (auto it = new_map.begin(); it != new_map.end();
         ++it)
        A[it->first] = it->second;
}
 
// Driver Code
int main()
{
    vector arr = { 2, 2, 5, 1 };
    int N = arr.size();
    vector > query = { { 2, 4 }, { 5, 2 } };
    update(arr, N, query);
    for (int i = 0; i < N; ++i) {
        cout << arr[i] << " ";
    }
 
   return 0;
}
 
    // This code is contributed by rakeshsahni


Python3
# Python program for above approach
 
# Function to replace all the
# occurrences of a number with
# another given number for Q queries
def update(A, N, Q):
      # Creating a hashmap
    hashmap = {a:[] for a in A}
    for i in range(N):
        hashmap[A[i]].append(i)
     
    # Iterating with q in given queries
    for q in Q:
        if q[0] in hashmap:
            if q[1] in hashmap:
                hashmap[q[1]].extend(hashmap[q[0]])
            else:
                hashmap[q[1]] = hashmap[q[0]]
            del hashmap[q[0]]
 
    # Creating map to store key value pairs
    new_map = {}
    for key, value in hashmap.items():
        for index in value:
            new_map[index] = key
             
    # Updating the main array with final values
    for key in new_map.keys():
        A[key] = new_map[key]
     
# Driver Code
if __name__ == '__main__':
  arr = [2, 2, 5, 1]
  N = len(arr)
  query = [[2, 4], [5, 2]]
  update(arr, N, query)
  print(arr)


Javascript


输出:
[4, 4, 2, 1]

时间复杂度: O(max(N, Q)),其中 N 是 arr[] 的大小,Q 是 query[][] 的大小。
辅助空间: O(N)