leetcode 350. 两个数组的交集 II(Intersection of Two Arrays II)

题目描述:

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2,2]

示例 2:

    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出: [4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。

进阶:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

解法:

class Solution {
public:
    
    // method 1:
    vector<int> intersect1(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> mp1;
        unordered_map<int, int> mp2;
        for(int val : nums1){
            if(mp1.find(val) == mp1.end()){
                mp1[val] = 1;
            }else{
                mp1[val]++;
            }
        }
        
        for(int val : nums2){
            if(mp2.find(val) == mp2.end()){
                mp2[val] = 1;
            }else{
                mp2[val]++;
            }
        }
        
        vector<int> res;
        for(auto it : mp1){
            int val = it.first;
            if(mp2.find(val) != mp2.end()){
                int count = min(it.second, mp2[val]);
                for(int i = 0; i < count; i++){
                    res.push_back(val);
                }
            }
        }
        return res;
    }
    
    // method 2:
    vector<int> intersect2(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        vector<int> res;
        int sz1 = nums1.size();
        int sz2 = nums2.size();
        int i = 0, j = 0;
        while(i < sz1 && j < sz2){
            if(nums1[i] == nums2[j]){
                res.push_back(nums1[i]);
                i++;
                j++;
            }else if(nums1[i] < nums2[j]){
                i++;
            }else{
                j++;
            }
        }
        return res;
    }
    
    // method 3:
    vector<int> intersect3(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> mp1;
        vector<int> res;
        for(int val : nums1){
            if(mp1.find(val) == mp1.end()){
                mp1[val] = 1;
            }else{
                mp1[val]++;
            }
        }
        
        for(int val : nums2){
            if(mp1.find(val) != mp1.end()){
                res.push_back(val);
                mp1[val]--;
                if(mp1[val] == 0){
                    mp1.erase(val);
                }
            }
        }
        
        return res;
    }
    
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        // return intersect1(nums1, nums2);
        // return intersect2(nums1, nums2);
        return intersect3(nums1, nums2);
    }
};

猜你喜欢

转载自www.cnblogs.com/zhanzq/p/10575206.html