1. 程式人生 > 實用技巧 >350. 兩個陣列的交集 II-7月13日

350. 兩個陣列的交集 II-7月13日

題目

350. 兩個陣列的交集 II

我的思路

我最開始的思路:外迴圈遍歷陣列1,對於每個陣列1的元素,在陣列2中找是否有相同的元素,若有新增到新陣列並從陣列2刪除。時間複雜度是m*n。

借用雜湊表,可以降低再陣列2中找相同元素的複雜度,代價是需要是為陣列2構造一個雜湊表。其中雜湊表的key是元素的值,value是元素在陣列中出現的次數。若陣列2中存在與當前遍歷的陣列1中相同的元素,把key值-1。時間複雜度是m+n。空間複雜度是n(雜湊表)。

如果給定的陣列已經排好序,可以用滑動視窗的思想:從小到大遍歷陣列1中的元素,在陣列2中設一個指標,最開始指向陣列2最小的元素。若當前遍歷的陣列1中的元素與陣列2中指標當前指向的元素不匹配,那麼指標右移;若匹配(相同),陣列1中的指標與陣列2中的指標同時右移。直到兩個指標都達到最右端。時間複雜度是m+n(不包括排序的時間代價)。 如果nums2 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中:意味著對陣列2進行排序會有大量的IO代價。所以最好為陣列1建立雜湊表,遍歷陣列2,只進行必要的IO操作。

我的實現

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> results;
        for(auto it : nums1){
            auto temp_it=find(nums2.begin(),nums2.end(),it);
            if(temp_it!=nums2.end()){
                results.push_back(it);
                nums2.erase(temp_it);
            }
        }
        
return results; } }; //外迴圈遍歷陣列1,對於每個陣列1的元素,在陣列2中找是否有相同的元素,若有新增到新陣列並從陣列2刪除; //1.如果給定的陣列已經排好序,可以用滑動視窗的思想:從小到大遍歷陣列1中的元素,在陣列2中設一個指標,最開始指向陣列2最小的元素。若當前遍歷的陣列1中的元素與陣列2中指標當前指向的元素不匹配,那麼指標右移;若匹配(相同),陣列1中的指標與陣列2中的指標同時右移。直到兩個指標都達到最右端 //3.陣列2元素的遍歷作為外迴圈,減少IO次數

拓展學習

記住可以藉助雜湊表來降低查詢元素的時間複雜度