1. 程式人生 > >leetcode 350. 兩個數組的交集 II(Intersection of Two Arrays II)

leetcode 350. 兩個數組的交集 II(Intersection of Two Arrays II)

res fir solution 描述 uno else title 加載 sort

目錄

  • 題目描述:
  • 示例 1:
  • 示例 2:
  • 進階:
  • 解法:

題目描述:

給定兩個數組,編寫一個函數來計算它們的交集。

示例 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);
    }
};

leetcode 350. 兩個數組的交集 II(Intersection of Two Arrays II)