350. 两个数组的交集 II
题目
- 给你两个整数数组 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]
法一、排序+双指针
- 思路:将两个数组进行排序,随后用两个指针分别指向第一个元素,
当i指向的nums1值小于j指向的nums2值时,i向后移一位;
当i指向的nums1值等于j指向的nums2值时,把i指向的nums1的值加入输出数组r,并且i,j 都向后移一位;
当i指向的nums1值大于j指向的nums2值时,j向后移一位;
最后,输出保存的数组r
class Solution:
def intersect(self, nums1: [int], nums2: [int]) -> [int]:
nums1.sort()
nums2.sort()
r = []
i, j = 0, 0
while i < len(nums1) and j < len(nums2):#以较小的数组长度为结束条件
if nums1[i] < nums2[j]:
i += 1
elif nums1[i] == nums2[j]:
r.append(nums1[i])
i += 1
j += 1
else:
j += 1
return r
法二、网友一行解法
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list((Counter(nums1) & Counter(nums2)).elements())
- Counter(nums1)和Counter(nums2)分别用于创建nums1和nums2的计数器对象。计数器对象是一种字典(dictionary)的子类,它将列表中的元素作为键,出现的次数作为对应的值。
- & 运算符用于对两个计数器对象进行交集操作,得到一个新的计数器对象,其中包含了两个列表中共同出现的元素及其出现次数。
- elements() 方法返回一个迭代器,用于按照元素的重复次数逐个输出元素。这里使用 list() 函数将迭代器转换为一个列表,以得到最终的结果列表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人