350. 两个数组的交集 II
注意,题中有个进阶要求:
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
这时推荐哈希表解法。
因为无法一次加载nums2的元素到内存中的话,无法对nums2进行排序;而哈希表算法中只对nums2进行查询操作。
解法一:先排序,然后用指针
class Solution(object):
def intersect(self, nums1, nums2):
"""
先排序,后指针
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums1.sort()
nums2.sort()
pos1 = pos2 = 0
intersection = []
while pos1 < len(nums1) and pos2 < len(nums2):
if nums1[pos1] == nums2[pos2]:
intersection.append(nums1[pos1])
pos1 += 1
pos2 += 1
elif nums1[pos1] < nums2[pos2]:
pos1 += 1
else:
pos2 += 1
return intersection
解法二:哈希表
class Solution(object):
def intersect(self, nums1, nums2):
"""
哈希表
先遍历一个数组,将其中数字出现的次数记录下来,每出现一次值+1
然后再遍历另一个数组,数字每出现一次就将哈希表中对应的值-1
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
len1 = len(nums1)
len2 = len(nums2)
# 为了降低空间复杂度,先遍历短的数组(这是为什么???????)
if len1 > len2:
# 交换两个入参的位置来达到交换两个数组的效果
return self.intersect(nums2, nums1)
table = dict()
for i in nums1:
if i not in table:
table[i] = 1
else:
table[i] += 1
intersection = []
for i in nums2:
if i in table and table[i] != 0:
table[i] -= 1
intersection.append(i)
return intersection
解法三:暴力
这是我自己写的,强行解答,嘻嘻
class Solution(object):
def intersect(self, nums1, nums2):
"""
暴力法
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
nums = []
for i in nums1:
for j in nums2:
if i == j:
nums.append(j)
break
try:
nums2.remove(i)
except Exception:
pass
return nums