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;
    }
};

 

posted @ 2020-08-21 20:53  布羽  阅读(129)  评论(0)    收藏  举报