時間複雜度:O(n+m+D),其中 n 和 m 分別是 nums1 和 nums2 的長度,D 是值域大小,本題中為 1001。
空間複雜度:O(D),需要額外的空間來存儲兩個計數陣列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defintersect(self, nums1: List[int], nums2: List[int]) -> List[int]: # return list((Counter(nums1) & Counter(nums2)).elements()) cnt1 = [0] * 1001 cnt2 = [0] * 1001 for x in nums1: cnt1[x] += 1 for x in nums2: cnt2[x] += 1 ans = [] for x inrange(1001): ans += [x] * min(cnt1[x], cnt2[x]) return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2){ vector<int> cnt1(1001), cnt2(1001); for (int x : nums1) cnt1[x]++; for (int x : nums2) cnt2[x]++; vector<int> ans; for (int x = 0; x <= 1000; x++) { for (int i = 0; i < min(cnt1[x], cnt2[x]); i++) { ans.push_back(x); } } return ans; } };
方法二:雜湊表(Hash Table)
方法一中我們先遍歷兩個陣列,然後再遍歷值域或索引的交集,但若 x∈nums1∧x∈/nums2∨x∈/nums1∧x∈nums2 ,則不需要考慮 x 。因此只需要遍歷兩個陣列各一次即可。
同樣先遍歷一次 nums1 ,令 cnt1 為 nums1 中每個數字出現的次數。在遍歷 nums2 的時候,對於每個數字 x ,若 cnt1[x]>0 ,則將 x 加入答案陣列中,並將 cnt1[x] 減一。
classSolution: defintersect(self, nums1: List[int], nums2: List[int]) -> List[int]: # cnt = defaultdict(int) cnt = [0] * 1001 for x in nums1: cnt[x] += 1 ans = [] for x in nums2: if cnt[x] > 0: ans.append(x) cnt[x] -= 1 return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2){ // unordered_map<int, int> cnt; vector<int> cnt(1001); for (int x : nums1) cnt[x]++; vector<int> ans; for (int x : nums2) { if (cnt[x] > 0) { ans.push_back(x); cnt[x]--; } } return ans; } };
若 nums1[i]=nums2[j] ,則將 nums1[i] 加入答案陣列中,並將 i 和 j 同時往右移動。
複雜度分析
時間複雜度:O(nlogn+mlogm),其中 n 和 m 分別是 nums1 和 nums2 的長度。
若已經是有序的,則時間複雜度是 O(n+m)。
空間複雜度:O(1),忽略排序的空間複雜度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution: defintersect(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1.sort() nums2.sort() m, n = len(nums1), len(nums2) i, j = 0, 0 ans = [] while i < m and j < n: if nums1[i] < nums2[j]: i += 1 elif nums1[i] > nums2[j]: j += 1 else: ans.append(nums1[i]) i += 1 j += 1 return ans