题目链接如下:
350. 两个数组的交集 IIhttps://leetcode.cn/problems/intersection-of-two-arrays-ii/
方法总结:
(1)字典快速查询
(2)sort()+双指针
(1)第一反应,统计个数用Counter()(python自带强大的collections库)最便捷的字典,不过这种方法还是慢了:
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
c1=collections.Counter(nums1)#很强的内置collections库
c2=collections.Counter(nums2)
#print(c1,c2)
inter=[]
for i1,num1 in c1.items():
#print(i1,num1)
for i2,num2 in c2.items():#注意,字典中遍历items不是item
if i1==i2:
inter+=[i1]*min(num1,num2)
return inter
两个循环还是影响效率了,所以优化一下:
【用collections.Counter()产生一个统计个数的字典,然后只使用一个循环检索另一个list中的元素】
代码如下:
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
# if len(nums1)>len(nums2):
# nums1,nums2=nums2,nums1
if len(nums1) > len(nums2):
return self.intersect(nums2, nums1)
m = collections.Counter(nums1)
print(m)
# for num in nums1:
# m[num] += 1
# print(m)
intersection = list()
for num in nums2:
#counter个数>0
if m.get(num, 0)>0:
#if (count := m.get(num, 0)) > 0:
intersection.append(num)
m[num] -= 1
if m[num] == 0:
m.pop(num)
return intersection
(2)一种更有趣的方法,排序+双指针,效率极高:
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
#排序+双指针
#排序后变为有序排列,循环索引的时候不会漏掉
nums1.sort()
nums2.sort()
i,j=0,0
intersect=[]
while i<len(nums1) or j<len(nums2):
if i==len(nums1):#说明nums1已经遍历完成,后面没有符合条件的数据
break
elif j==len(nums2):
break
if nums1[i]<nums2[j]:
i+=1
elif nums1[i]>nums2[j]:
j+=1
else:#nums1[i]==nums2[j]:
intersect.append(nums1[i])
i+=1
j+=1
return intersect