leetcode 350. 兩個數組的交集 II(Intersection of Two Arrays II)
阿新 • • 發佈:2019-03-22
res fir solution 描述 uno else title 加載 sort
目錄
- 題目描述:
- 示例 1:
- 示例 2:
- 進階:
- 解法:
題目描述:
給定兩個數組,編寫一個函數來計算它們的交集。
示例 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: // method 1: vector<int> intersect1(vector<int>& nums1, vector<int>& nums2) { unordered_map<int, int> mp1; unordered_map<int, int> mp2; for(int val : nums1){ if(mp1.find(val) == mp1.end()){ mp1[val] = 1; }else{ mp1[val]++; } } for(int val : nums2){ if(mp2.find(val) == mp2.end()){ mp2[val] = 1; }else{ mp2[val]++; } } vector<int> res; for(auto it : mp1){ int val = it.first; if(mp2.find(val) != mp2.end()){ int count = min(it.second, mp2[val]); for(int i = 0; i < count; i++){ res.push_back(val); } } } return res; } // method 2: vector<int> intersect2(vector<int>& nums1, vector<int>& nums2) { sort(nums1.begin(), nums1.end()); sort(nums2.begin(), nums2.end()); vector<int> res; int sz1 = nums1.size(); int sz2 = nums2.size(); int i = 0, j = 0; while(i < sz1 && j < sz2){ if(nums1[i] == nums2[j]){ res.push_back(nums1[i]); i++; j++; }else if(nums1[i] < nums2[j]){ i++; }else{ j++; } } return res; } // method 3: vector<int> intersect3(vector<int>& nums1, vector<int>& nums2) { unordered_map<int, int> mp1; vector<int> res; for(int val : nums1){ if(mp1.find(val) == mp1.end()){ mp1[val] = 1; }else{ mp1[val]++; } } for(int val : nums2){ if(mp1.find(val) != mp1.end()){ res.push_back(val); mp1[val]--; if(mp1[val] == 0){ mp1.erase(val); } } } return res; } vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { // return intersect1(nums1, nums2); // return intersect2(nums1, nums2); return intersect3(nums1, nums2); } };
leetcode 350. 兩個數組的交集 II(Intersection of Two Arrays II)