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