持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
一、题目
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
作者:力扣 (LeetCode) 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、 思路
暴力解法
- 由题意可知,要找两个list的交集。那么只需要找到最小的list,在最小的list中循环值,在大的list中查,存在的话,就放在一个新的数组中
- 第一步给数组去重,set
- 第二步:判断最小的list和最大的list
- 第三步,嵌套循环,将交集的参数放入新的list中,返回list
- 优化
- 嵌套循环使用推导式
- 最小值与最大值得判断可以通过递归处理
排序双指针
- 通过排序,将数组变为有序数组,那么两个数组中,交集必然相等,使用双指针处理
- 因此有三种情况,
- 第一种是相等的情况,如果相等,且返回的数组list1中没有值,则添加进数组,同时双指针都相加1
- 第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
- 第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1
三、代码
nums1, nums2= [4,9,5,1], [9,4,9,8,4,1]
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
"""
由题意可知,要找两个list的交集。那么只需要找到最小的list,在最小的list中循环值,在大的list中查,存在的话,就放在一个新的数组中
第一步给数组去重,set
第二步:判断最小的list和最大的list
第三步,嵌套循环,将交集的参数放入新的list中,返回list
优化
嵌套循环使用推导式
最小值与最大值得判断可以通过递归处理
:param nums1:
:param nums2:
:return:
"""
list1, list2, maxNum, minNum = set(nums1), set(nums2), [], []
if len(list1)> len(list2):
maxNum, minNum = list1, list2
else:
maxNum, minNum = list2, list1
# list3 = []
# for i in minNum:
# if i in maxNum:
# list3.append(i)
# return list3
return [i for i in minNum if i in maxNum]
Solution().intersection(nums1, nums2)
排序双指针
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
"""
通过排序,将数组变为有序数组,那么两个数组中,交集必然相等,使用双指针处理
因此有三种情况,
第一种是相等的情况,如果相等,且返回的数组list1中没有值,则添加进数组,同时双指针都相加1
第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1
:param nums1:
:param nums2:
:return:
"""
nums1.sort()
nums2.sort()
list1, len1, len2, firstIndex, secondIndex = list(), len(nums1), len(nums2), 0, 0
while firstIndex < len1 and secondIndex < len2:
if nums1[firstIndex] == nums2[secondIndex]:
if nums1[firstIndex] not in list1:
list1.append(nums1[firstIndex])
firstIndex += 1
secondIndex += 1
elif nums1[firstIndex] < nums2[secondIndex]:
firstIndex += 1
else:
secondIndex += 1
return list1
Solution().intersection(nums1, nums2)