题目 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
思路
思路其实还算明确,使用哈希表也就是unordered_map对其中一个数组内部的数字进行存储和计数,然后遍历另一个数组查找即可。代码实现中有个值得注意的地方,就是当两个数组长度一致的时候,如果出现相同的数字,这时谁先做哈希表会有一定的影响。
解决方法就是查找另一个数组的时候,查到一个就让哈希表中该数字的计数-1,计数为零就不往答案里添加数字了。
代码实现
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> data;
vector<int> short_num, long_num;
if (nums1.size() < nums2.size()) {
short_num = nums1;
long_num = nums2;
}
else {
short_num = nums2;
long_num = nums1;
}
for (int i = 0; i < short_num.size(); i++) {
if (data.find(short_num[i]) == data.end()) {
data.insert(pair<int, int>(short_num[i], 1));
}
else {
data[short_num[i]] += 1;
}
}
short_num.clear();
for (int i = 0; i < long_num.size(); i++) {
if (data.find(long_num[i]) != data.end() && data[long_num[i]] > 0) {
short_num.push_back(long_num[i]);
data[long_num[i]]--;
}
}
return short_num;
}
};