题目如下:
给定两个数组,写一个方法来计算它们的交集。 例如: 给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. 注意: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。 跟进: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
解题思路:
1.用hash即可。将数组1中元素全部插入到hash列表中,然后对数组2中的每个元素进行查找即可。时间复杂度为O(n),空间复杂度为O(N)。
代码如下:
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { map<int,int> cnt1; map<int,int> cnt2; vector<int> ret; for(int i = 0;i < nums1.size();++i){ if(cnt1.find(nums1[i])!=cnt1.end()){ cnt1[nums1[i]]++; } else{ cnt1[nums1[i]] = 1; } } for(int i = 0;i < nums2.size();++i){ if(cnt2.find(nums2[i])!=cnt2.end()){ cnt2[nums2[i]]++; } else{ cnt2[nums2[i]] = 1; } } map<int,int>::iterator it1; map<int,int>::iterator it1; for(it1 = cnt1.begin();it1!= cnt1.end();++it1){ it2 = cnt1.find(it1->first); if(it2!=cnt2.end()){ if(it2->second == it1->second){ for(int i = 0;i < it1->second; ++i){ ret.push_back(it1->first); } } } } return ret; } };
2.排序好的数组。对两个数组排序好的元素依次遍历即可找到两个数组中相同的元素。
C++代码如下:
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); vector<int> res; int l1 = 0; int l2 = 0; while(l1 < nums1.size()&&l2 < nums2.size()){ if(nums1[l1] == nums2[l2]){ res.push_back(nums1[l1]); ++l1; ++l2; }else if(nums1[l1] > nums2[l2]){ ++l2; }else{ ++l1; } } return res; } };