将 Array 的两个 Map 合并为 Array 的一个排序 Map
给定两个映射map1和map2 ,其中一个字符串作为键,整数数组作为值,任务是将它们合并到一个映射中,如果一个键在两个映射中是通用的,则应该合并相应的数组。
例子:
Input: map1 = { (“key1”, {0, 1}), (“key2”, {0, 1}) }, map2 = { (“key2”, {1, 2}) };
Output: { (key1, {0, 1}), (key2, {0, 1, 2}) }
Explanation: After merging key1 array will become {0, 1} and for key2 after merging array will become {0, 1, 2}
Input: map1 = {(“key1”, {0, 1})}, map2 = {(“key2”, {1, 2})};
Output: {(key1, [0, 1]), (key2, [1, 2])}
方法:该问题的解决方案是基于合并两个数组的概念。请按照以下步骤操作:
- 创建地图以存储合并的地图
- 遍历map1并将所有键值对存储在map1中。
- 遍历 map2 并:
- 如果map2的key在map1中不存在,只需在map1中插入这个键值对即可
- 如果map2的key存在于map1中,
- 取 map1 的数组和 map2 的数组
- 对两个数组进行排序,然后
- 使用合并两个数组中提到的方法合并它们。
- 最后返回 map3。
下面是上述方法的实现。
C++
// C++ code to implement the approach
#include
using namespace std;
// Function to merge arrays
vector mergeArrays(vector& a, vector& b,
int n, int m)
{
vector mergedArray;
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
map mp;
// Inserting values to a map.
for (int i = 0; i < n; i++)
mp[a[i]] = true;
for (int i = 0; i < m; i++)
mp[b[i]] = true;
// Printing keys of the map.
for (auto i : mp)
mergedArray.push_back(i.first);
return mergedArray;
}
// Function to merge maps
map >
mergeMap(map >& map1,
map >& map2)
{
map > map3;
map3.insert(map1.begin(), map1.end());
for (auto itr : map2) {
if (map3.find(itr.first) == map3.end())
map3.insert({ itr.first, itr.second });
else {
auto temp_itr = map3.find(itr.first);
vector arr = mergeArrays(
itr.second, temp_itr->second,
itr.second.size(),
temp_itr->second.size());
map3[itr.first] = arr;
}
}
return map3;
}
// Driver code
int main()
{
map > map1, map2, map3;
map1.insert({ "key1", { 0, 1 } });
map1.insert({ "key2", { 0, 1 } });
map2.insert({ "key2", { 1, 2 } });
// Function call
map3 = mergeMap(map1, map2);
for (auto itr : map3) {
cout << "\"" << itr.first << "\", { ";
for (auto x : itr.second)
cout << x << " ";
cout << "}\n";
}
return 0;
}
Javascript
输出
"key1", { 0 1 }
"key2", { 0 1 2 }
时间复杂度: O(N * log N + M * log M)
辅助空间: O(M + N)