题目描述
给你两个整数数组 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
解题思路
此题注意提示,提示中 元素值在0~1000,利用哈希表的思想,将一个容器的元素(x)作为键,其出现的次数作为值。遍历第二个容器中的元素(y),判断元素y是否在哈希表中,若在则加入,并将其键对应的值-1。
//数组实现
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int>ans;
int a[1005]={0};//一定要初始化为0,读者想一想为什么?
for(auto x:nums1)
a[x]++;
for(auto y:nums2)
if(a[y]){
ans.push_back(y);
a[y]--;
}
return ans;
}
哈希表实现(数组实现的效率会更高)
vector<int> intersect1(vector<int>& nums1, vector<int>& nums2) {
vector<int>ans;
unordered_map<int,int> aa;
for(auto x:nums1)
aa[x]++;
for(auto y:nums2)
if(aa[y]){
ans.push_back(y);
--aa[y];
}
return ans;
}