【简单】力扣算法题解析LeetCode349:两个数组的交集

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode 349: 两个数组的交集

问题抽象: 给定两个整数数组 nums1nums2,要求返回它们的 交集数组,满足以下核心需求:

  1. 交集定义

    • 输出结果需包含所有 同时存在于两个数组中的元素,且每个元素 仅出现一次(自动去重);
    • 结果数组的元素顺序 不限(任意顺序输出均有效)。
  2. 计算约束

    • 时间复杂度 O(m + n)mn 为两数组长度),空间复杂度 O(min(m, n))
    • 需通过 哈希集合 实现高效查找:
      • 遍历较小数组存入集合(空间优化);
      • 遍历较大数组时检查元素是否存在于集合。
  3. 边界处理

    • 若任一数组为空,返回空数组;
    • 输入数组可能含重复元素(输出需去重);
    • 特殊值:
      • nums1 = [1,2,2,1], nums2 = [2,2] → 输出 [2]
      • nums1 = [4,9,5], nums2 = [9,4,9,8,4] → 输出 [4,9][9,4]
    • 元素值范围:0 ≤ nums1[i], nums2[i] ≤ 1000(可利用有限值域优化)。

输入:两个整数数组 nums1nums2(长度均 ≥0)。
输出:交集元素组成的数组(元素去重,顺序不限)。


解题思路

题目要求计算两个数组的交集,结果中的每个元素必须是唯一的(即去重)。核心思路如下:

  1. 空间换时间:使用HashSet存储第一个数组的所有元素(自动去重),时间复杂度为O(m)。
  2. 快速查找:遍历第二个数组,利用HashSet的O(1)查找特性判断元素是否在第一个数组中,时间复杂度为O(n)。
  3. 动态收集结果:使用另一个HashSet存储交集元素(避免重复添加),最后将其转换为数组返回。

此方法总时间复杂度为O(m+n),空间复杂度为O(m)(最坏情况)。相比排序+双指针法,此方法无需排序且执行效率更高。


代码实现(Java版)🔥点击下载源码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 将 nums1 存入 HashSet 实现去重和快速查找
        Set<Integer> set = new HashSet<>();
        for (int num : nums1) {
            set.add(num);
        }
        
        // 用 HashSet 存储结果,自动去重
        Set<Integer> resultSet = new HashSet<>();
        for (int num : nums2) {
            if (set.contains(num)) {
                resultSet.add(num);
            }
        }
        
        // 将结果集转换为数组
        int[] result = new int[resultSet.size()];
        int index = 0;
        for (int num : resultSet) {
            result[index++] = num;
        }
        return result;
    }
}

代码说明

  1. 去重处理

    • 第一个循环将nums1存入HashSet,自动去除重复元素。
    • 第二个循环遍历nums2时,用resultSet存储交集元素,确保结果无重复。
  2. 高效查找

    • set.contains(num)操作时间复杂度为O(1),整体查找过程为O(n)。
  3. 结果转换

    • 使用增强for循环将resultSet转为数组,时间复杂度O(k)(k为结果元素数量)。
  4. 复杂度分析

    • 时间复杂度:O(m + n),其中m、n为数组长度。每个元素最多被遍历两次。
    • 空间复杂度:O(m + k),最坏情况set存储m个元素,resultSet存储k个元素(k ≤ min(m,n))。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值