1. 程式人生 > 實用技巧 >LeetCode 350. 兩個陣列的交集 II 雜湊

LeetCode 350. 兩個陣列的交集 II 雜湊

地址https://leetcode-cn.com/problems/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
使用雜湊表記錄 同時還要記錄出現個數

class Solution {
public:
    map<int,int> mm;
    vector<int> ans;
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        for(auto& e: nums1){
            mm[e]++;
        }

        for(auto& e:nums2){
            
if(mm[e] !=0 ){ mm[e]--; ans.push_back(e); } } return ans; } };

擴充套件問題

如果給定的陣列已經排好序呢?你將如何優化你的演算法?
兩個陣列各設定一個指標 指向當前比較的數字 由於陣列已經有序,
一旦指向數值不相等的元素,即可不再繼續檢測

如果nums1的大小比nums2小很多,哪種方法更優?
雜湊表記錄nums1的資料 然後區域性讀取nums2的元素進行比較

如果nums2的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?

見回答2。 如果兩個陣列都很大,那麼就是外排序方案了