1. 程式人生 > >利用unordered_map特性求交集

利用unordered_map特性求交集

unordered_map 是關聯容器,含有帶唯一鍵的鍵-值 pair 。搜尋、插入和元素移除擁有平均常數時間複雜度。

元素在內部不以任何特定順序排序,而是組織進桶中。元素放進哪個桶完全依賴於其鍵的雜湊。這允許對單獨元素的快速訪問,因為一旦計算雜湊,則它準確指代元素所放進的桶。

 

讓我們看下原題:
給定兩個陣列,編寫一個函式來計算它們的交集。

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]

Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]

注意:

結果中的每個元素應該出現在兩個陣列中顯示的次數。
結果可以是任何順序。

優化:

如果給定的陣列已經排序怎麼辦? 你會如何優化你的演算法?
如果nums1的尺寸與nums2的尺寸相比較小怎麼辦? 哪種演算法更好?
如果nums2的元素儲存在磁碟上,並且記憶體有限,以致您無法一次將所有元素載入到記憶體中,該怎麼辦?

 

程式碼分析:

class Solution {
public:
    vector<int> intersect(vector<int>& a, vector<int>& b) {
        unordered_map<int, int> ctr;
        for (int i : a)
            ctr[i]++;
        vector<int> out;
        for (int i : b)
            if (ctr[i]-- > 0)
                out.push_back(i);
        return out;
    }
};