leetcode 350.两个数组的交集Ⅱ
这题是“两个数组的交集”问题的第二版,多了一个“输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。”这个要求。
但仍旧可以用哈希法来做。对其中数组建立哈希表,其中键为元素值,值为元素频率。遍历另一个数组的元素,每在哈希表中找到相同元素,那么就把其对应频率减1并把数组当前元素放入答案数组。若发现频率已经为0,则不再放入答案数组。
这样子,时间复杂度为O(m|n),空间复杂度为O(n|m)。若两数组长度差异比较大,那么就需要在两个复杂度中做取舍,是要空间优化还是时间优化。
在第一版中,没有那个要求的限制,还可以使用二分查找。思路是对其中一个数组排序,遍历另一个数组,搜索有序数组的时候就用二分查找。找到的结果放入集合中。这个方法并不适用于第二版。而且说实话实现繁琐且效果一般。
最简单的办法,就是排序两个数组,用双指针法。时间复杂度为O(nlogn+mlogm)。这在算法导论中是很经典的例子。实现代码如下。
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); int len1=nums1.size(),len2=nums2.size(),i=0,j=0; vector<int> ans; while (i!=len1&&j!=len2){ if(nums1[i]==nums2[j]){ ans.push_back(nums1[i]); ++i;++j; } else if (nums1[i]>nums2[j]){ ++j; } else{ ++i; } } return ans; } };

浙公网安备 33010602011771号