力扣哈希表
349.两个数组的交集
349.两个数组的交集
https://leetcode.cn/problems/intersection-of-two-arrays/
题目
给定两个数组 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 <= 10000 <= nums1[i], nums2[i] <= 1000
思路
本题要求两个数组的交集(去重),核心在于快速判断一个元素是否在另一个数组中,自然想到哈希集合(set):
- 将
nums1转为集合set1,实现 O(1) 的查找; - 遍历
nums2,若当前元素存在于set1中,则将其加入结果集合result_set; - 最终将结果集合转为列表返回。
复杂度分析:
- 时间复杂度:O(m + n),其中 m、n 分别是两个数组的长度
- 空间复杂度:O(m),用于存储
set1
由于题目限制
0 <= nums1[i], nums2[i] <= 1000,也可用长度为 1001 的数组代替集合,但集合的写法更通用。
解法
class Solution:
def intersection(self, nums1: list[int], nums2: list[int]) -> list[int]:
# 将 nums1 转为集合,便于 O(1) 查找
set1 = set(nums1)
result_set = set()
for num in nums2:
if num in set1:
result_set.add(num)
return list(result_set)解释
| 代码片段 | 作用与原因 |
|---|---|
set1 = set(nums1) | 将 nums1 转为哈希集合,后续每次判断 num in set1 只需 O(1) |
result_set = set() | 用集合收集交集结果,自动去重,避免结果中出现重复元素 |
for num in nums2: | 遍历 nums2 的每个元素,逐一判断是否属于交集 |
if num in set1: | 利用哈希集合的 O(1) 查找特性,快速判断交集 |
result_set.add(num) | 将匹配的元素加入结果集合,集合自动处理重复问题 |
return list(result_set) | 将集合转为列表,符合题目返回类型要求 |