力扣哈希表

349.两个数组的交集

349.两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/

题目

给定两个数组 nums1nums2 ,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序

示例

示例 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

思路

本题要求两个数组的交集(去重),核心在于快速判断一个元素是否在另一个数组中,自然想到哈希集合(set)

  1. nums1 转为集合 set1,实现 O(1) 的查找;
  2. 遍历 nums2,若当前元素存在于 set1 中,则将其加入结果集合 result_set
  3. 最终将结果集合转为列表返回。

复杂度分析

  • 时间复杂度: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)将集合转为列表,符合题目返回类型要求