携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
本题考察数列相关知识,为简单题350.两个数组的交集
350. 两个数组的交集
题目
给你两个整数数组 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]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
代码
排序 + 双指针
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
result = []
i = j = 0
while i < len(nums1) and j < len(nums2):
if nums1[i] < nums2[j]:
i += 1
elif nums1[i] > nums2[j]:
j += 1
else:
result.append(nums1[i])
i += 1
j += 1
return result
用字典
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
amap = {}
result = []
for i in nums1:
if i in amap:
amap[i] += 1
else:
amap[i] = 1
for j in nums2:
if j in amap:
val = amap[j]
else:
val = 0
if val > 0:
result.append(j)
amap[j] -= 1
return result
解析
有两种方法:
方法一:
1.把两个数组分别排序
2.分别定义一个“指针”指向开头,用while循环(以“指针”小于数组长度为条件),根据“指针”所指的两个数的大小分别移动“指针”,如果两个“指针”指向的数相等则存入result
3.循环结束后,剩下没有遍历的数肯定不可能同时在两个数组里,所以输出result即可
方法二:
1.定义一个字典amap,把nums1数组保存成字典的形式
2.遍历nums2数组里的元素,如果在字典amap里则减去这个元素,并把该元素保存到result里
3.遍历结束后result就是所有重复数字,输出即可
来源:力扣(LeetCode)
链接:leetcode.cn/problems/in…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。