LeetCode #350. Intersection of Two Arrays II
阿新 • • 發佈:2020-12-07
題目
350. Intersection of Two Arrays II
解題方法
設定兩個字典dic1和dic2分別計數nums1和nums2,遍歷nums2做一個set記錄其中存在於dic1中的成員,然後遍歷這個set中的成員,找到其在dic1和dic2中的值,取兩個值的最小值count,然後在返回值中寫count個這個成員,最後返回。
時間複雜度:O(n)
空間複雜度:O(n)
Follow up中:
What if the given array is already sorted? How would you optimize your algorithm?
事實上如果已經排好序了,就可以換用雙指標做一個O(n)O(1)的方法了,不然應該是需要用雜湊表簡化時間複雜防止TLE的。
What if nums1's size is small compared to nums2's size? Which algorithm is better?
雜湊在針對這個問題上理論上應該是魯棒的,無需考慮列表的長度問題,仍然是O(n)O(n)時空複雜。但雙指標如果沒排好序的話就得先排序了,O(nlogn)O(1)時空複雜。相比而言其實就是一個空間換時間的問題,取決於空間儲存的寬裕程度。個人更傾向於雜湊表來做,更穩定一些,方便除錯。
What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
分成多個能放進記憶體的nums列表,多次呼叫雜湊表解決。
程式碼
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: dic1 = collections.Counter(nums1) dic2 = collections.Counter(nums2) numset = set() for i in nums2: if i in dic1: numset.add(i) rat = [] for i in numset: count = min(dic1[i], dic2[i]) while count: rat.append(i) count -= 1 return rat