给定两个数组,编写一个函数来计算它们的交集。
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
- 我们可以不考虑输出结果的顺序。
-
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?法一:用哈希表。将短的数组进行哈希,其中哈希键为数组值,哈希值为对应值出现次数。那么将长数组进行遍历,判断其中每个值是否在哈希中出现,若有出现则哈希值即元素出现次数减1,并且放入结果集中。减到0就删掉这个哈希键值。这样,求出交集。(哈希的原则是尽量哈希短数组)
-
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { if(nums1.size()>nums2.size()) intersect(nums2,nums1); unordered_map<int,int> map; vector<int> intersection; for(int num:nums1) ++map[num]; for(int num:nums2){ if(map.count(num)){ map[num]--; intersection.push_back(num); } if(map[num]==0) map.erase(num); } return intersection; } };
法二:利用双指针
-
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { int i=0,j=0; vector<int> intersection; sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); while(i<nums1.size()&&j<nums2.size()){ if(nums1[i]==nums2[j]){ intersection.push_back(nums1[i]); i++;j++; } else if(nums1[i]<nums2[j]){ i++; }else{ j++; } } return intersection; } };