领扣 两个数组的交集 II
两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
思路
1,将每个数组放入到各自的一个字典dict 中 ,并且记录次数
2. 如果一个元素在两个dict中出现,那这个数肯定重复
*3.重复的数字,可能有多个 但是我们之前的记录的次数取小的循环即可,每次得到的数放入到数组中,
*
代码片
下面展示一些 内联代码片
。
// An highlighted block
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
ans=[]
a=dict()
b=dict()
for x in nums1:
if x not in a:
a[x]=1
else:
a[x]+=1
for y in nums2:
if y not in b:
b[y]=1
else:
b[y]+=1
for k in a:
if k in b:
for _ in range(min(a[k],b[k])):
ans.append(k)
return ans
思路二
1.将一个数组放入到dict中去(空间复杂度减少了,时间复杂度也减少了)
2.循环遍历另外一个数组,如果这个数在dict中,并且次数大于0,那么我们把这个数加到新的数组ret中去,然后这个字典中这个数的次数减1
最终返回这个新的数组就是交集数组
代码片
下面展示一些 内联代码片
。
// An highlighted block
def intersect(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
m = len(nums1)
n = len(nums2)
if m == 0 or n == 0:
return []
dicts = {}
for i in nums1:
if i in dicts:
dicts[i] += 1
else:
dicts[i] = 1
ret = []
for j in nums2:
if j in dicts and dicts[j] > 0:
ret.append(j)
dicts[j] -= 1
return ret