1. 程式人生 > 實用技巧 >LeetCode #350. Intersection of Two Arrays II

LeetCode #350. Intersection of Two Arrays II

題目

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