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
posted @ 2020-12-07 18:03  老鼠司令  阅读(54)  评论(0编辑  收藏  举报