1. 程式人生 > 實用技巧 >leetcode 350.兩個陣列的交集Ⅱ

leetcode 350.兩個陣列的交集Ⅱ

這題是“兩個陣列的交集”問題的第二版,多了一個“輸出結果中每個元素出現的次數,應與元素在兩個陣列中出現次數的最小值一致。”這個要求。

但仍舊可以用雜湊法來做。對其中陣列建立雜湊表,其中鍵為元素值,值為元素頻率。遍歷另一個數組的元素,每在雜湊表中找到相同元素,那麼就把其對應頻率減1並把陣列當前元素放入答案陣列。若發現頻率已經為0,則不再放入答案陣列。

這樣子,時間複雜度為O(m|n),空間複雜度為O(n|m)。若兩陣列長度差異比較大,那麼就需要在兩個複雜度中做取捨,是要空間優化還是時間優化。

在第一版中,沒有那個要求的限制,還可以使用二分查詢。思路是對其中一個數組排序,遍歷另一個數組,搜尋有序陣列的時候就用二分查詢。找到的結果放入集合中。這個方法並不適用於第二版。而且說實話實現繁瑣且效果一般。

最簡單的辦法,就是排序兩個陣列,用雙指標法。時間複雜度為O(nlogn+mlogm)。這在演算法導論中是很經典的例子。實現程式碼如下。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int len1=nums1.size(),len2=nums2.size(),i=0
,j=0; vector<int> ans; while (i!=len1&&j!=len2){ if(nums1[i]==nums2[j]){ ans.push_back(nums1[i]); ++i;++j; } else if (nums1[i]>nums2[j]){ ++j; } else{ ++i; } }
return ans; } };