两个数组的交集 II
概述:给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
方法一:哈希表
思路:用字典分别对两个列表进行存储,然后取交集元素在两个字典中的最小次数即可。
# 哈希表
# 用字典分别对两个列表进行存储,然后取交集元素在两个字典中的最小次数即可。
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
if len(nums1) > len(nums2):
return self.intersect(nums2, nums1)
nums_dict = collections.Counter()
for num in nums1:
nums_dict[num] += 1
intersection = []
for num in nums2:
if (count:= nums_dict.get(num, 0)) > 0:
intersection.append(num)
nums_dict[num] -= 1
if nums_dict[num] == 0:
nums_dict.pop(num)
return intersection
方法二:排序+双指针
思路:先排序,然后指针分别指向两个列表进行判断,如果重复跳过即可。
# 排序+双指针
# 先排序,然后指针分别指向两个列表进行判断,如果重复跳过即可。
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
length_1, length_2 = len(nums1), len(nums2)
intersection = []
index_1, index_2 = 0, 0
while index_1 < length_1 and index_2 < length_2:
if nums1[index_1] < nums2[index_2]:
index_1 += 1
elif nums1[index_1] > nums2[index_2]:
index_2 += 1
else:
intersection.append(nums1[index_1])
index_1 += 1
index_2 += 1
return intersection
总结
简单题,挑战失败,提桶跑路。