350. 兩個陣列的交集 II-7月13日
阿新 • • 發佈:2020-07-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次數
拓展學習
記住可以藉助雜湊表來降低查詢元素的時間複雜度