开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
一、题目描述:
给定两个数组 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] 也是可通过的
提示:
- 1 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 1000
二、思路分析:
先对nums1和nums2进行排序,然后在两个数组中分别设置指针i和j。判断nums1[i]和nums2[j]的值得大小:
- 相同,则保存到结果数组res,i和j的值都增加(这里的增加还需要考虑跳过相同的值,防止传入相同的值到res)
- nums1[i]大,则j的值增加(跳过相同的值)
- nums2[j]大,则i的值相加(情况同上)
三、AC 代码:
class Solution(object):
def intersection(self, nums1, nums2):
m = len(nums1)
n = len(nums2)
i, j = 0, 0 # 设置双指针
if not nums1 or not nums2: # 如果有一个数组为空,则放回[]
return []
nums1.sort() #排序
nums2.sort()
res = []
while i < m and j < n:
if nums1[i] == nums2[j]: # 相等则保存值
res.append(nums1[i])
while i + 1 < m and nums1[i] == nums1[i + 1]: # 跳过相同的值
i += 1
while j + 1 < n and nums2[j] == nums2[j + 1]: # 同上
j += 1
i += 1
j += 1
elif nums1[i] < nums2[j]:
while i + 1 < m and nums1[i] == nums1[i + 1]:
i += 1
i += 1
else:
while j + 1 < n and nums2[j] == nums2[j + 1]:
j += 1
j += 1
return res
范文参考:
利用两个HashSet来存储元素,然后逐个判断是否有重复元素 - 两个数组的交集 - 力扣(LeetCode)
「代码随想录」349. 两个数组的交集:考察了set在哈希法中的应用(详解) - 两个数组的交集 - 力扣(LeetCode)