学习目标:
每日一题-求两个数组的交集学习内容:
题目
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例1
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例2
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
双指针法解题思路:
先对两个数组进行排序,然后使用两个指针,分别指向两个数组开始的位置。
如果两个指针指向的值相同,说明这个值是他们的交集,就把这个值加入到集合list中,然后两个指针在分别往后移一步。
如果两个指针指向的值不同,那么指向的值相对小的往后移一步,相对大的先不动,然后再比较
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
right = 0
left = 0
result = []
while right < len(nums1) and left < len(nums2):
if nums1[right] == nums2[left]:
result.append(nums1[right])
right+=1
left+=1
elif nums1[right] > nums2[left]:
left+=1
else:
right+=1
return result
解题思路二
遍历nums1中的所有元素,把它存放到map中,其中key就是nums1中的元素,value就是这个元素在数组nums1中出现的次数。
遍历nums2中的所有元素,查看map中是否包含nums2的元素,如果包含,就把当前值加入到集合list中,然后对应的value要减1。
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
my_map = {}
result = []
for item in nums1:
if item in my_map.keys():
my_map[item]+=1
else:
my_map[item]=1
for item in nums2:
if my_map.get(item) and my_map.get(item) > 0:
result.append(item)
my_map[item]-=1
return result