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


題目描述

【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 的元素存儲在磁盤上,磁盤內存是有限的,並且你不能一次加載所有的元素到內存中,你該怎麼辦?

第一次解答

思路
第一次遍歷,把長度較短的數組添加到哈希表,並計數每個數字出現次數。
第二次遍歷另一個數組,若與哈希表中重複,則哈希表次數-1,並添加該字符到結果。

代碼:

#include <unordered_map>
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        //默認nums1更短,若不是,我們通過遞歸的方式巧妙的交換元素
        if(nums1.size() > nums2.size()){
            return intersect(nums2, nums1);
        }

        // 第一次遍歷,把長度較短的數組添加到哈希表,並計數每個數字出現次數。   
        unordered_map<int, int> count;
        for(int i=0; i<nums1.size(); ++i){
            if(count.end() == count.find(nums1[i])){
                count[nums1[i]] = 1;
            }
            else{
                ++count[nums1[i]];
            }
        }

        // 第二次遍歷另一個數組,若與哈希表中重複,則哈希表次數-1,並添加該字符到結果。
        vector<int> result;
        for(int i=0; i<nums2.size(); ++i){
            if(count.end() != count.find(nums2[i])){
                --count[nums2[i]];
                result.push_back(nums2[i]);
                // 如果元素計數爲0,刪掉它
                if(0 == count[nums2[i]]){
                    count.erase(nums2[i]);
                }
            }
        }
        return result;
    }
};

結果:

截圖

相關/參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章