题目链接:350. 两个数组的交集 II
题目:
给你两个整数数组 nums1 和 nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
提示:
- 1 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 1000
进阶: 如果 nums2的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
思路和算法:
建立一个哈希表,
k
e
y
key
key值用来存放nums1中的元素,
v
a
l
u
e
value
value值用来存放
n
u
m
s
1
nums1
nums1中元素出现的次数。先遍历
n
u
m
s
1
nums1
nums1中的元素,将其插入
h
a
s
h
hash
hash表中,并将出现的元素的
v
a
l
u
e
value
value值置为1。而后遍历
n
u
m
s
2
nums2
nums2中的元素,如果元素能在
h
a
s
h
hash
hash表中找到,并且出现次数大于等于1,那么将该元素放入结果集
r
e
s
res
res,同时出现次数
v
a
l
u
e
value
value值减一。
代码(c++):
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res; //结果集
unordered_map<int, int> hash; //key:nums1中的元素 value:nums1中元素出现次数
for (int x : nums1) { //遍历nums1中的元素
if (!hash.count(x))
hash[x] = 1;
else
hash[x] += 1;
}
for (int x : nums2) {
if (hash.count(x) && hash[x] >= 1) { //如果找到并且出现次数大于等于1
res.push_back(x);
hash[x] -= 1;
}
}
return res;
}
};
进阶中出现的问题只会影响用“排序+双指针”的方法,而用哈希表并不会出现这种情况。因为哈希表方法不涉及增删改,只是查询,对需要的数据拿出来读就可以。