leetcode350 兩個陣列的交集 II (Easy)
阿新 • • 發佈:2020-07-23
題目來源:leetcode350 兩個陣列的交集 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 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?
解題思路:
方法一:用雜湊表記錄出現的次數
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> ans; map <int,int > m; for(auto num:nums1) m[num]++; for(auto num:nums2){ if(m.count(num)!=0&&m[num]>0){ ans.push_back(num); m[num]--; } } return ans; } };
方法二:排序+雙指標
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> ans; if(nums1.empty()||nums2.empty()) return ans; sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); int i=0,j=0; while(i<nums1.size()&&j<nums2.size()){ if(nums1[i]==nums2[j]){ ans.push_back(nums1[i]); i++; j++; } else if(nums1[i]<nums2[j]) { i++; } else j++; } return ans; } };