(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留

题目描述

给定两个数组 nums1nums2,返回它们的 交集 ,结果中的每个元素 不重复,顺序不限。

示例:

输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]


一、初次尝试 --- ArrayList + Set 混合

1️⃣ 思路

  • ArrayList 存结果(可变数组)

  • HashSetnums1 元素,方便快速查找

2️⃣ 代码尝试

java 复制代码
Set<Integer> record = new HashSet<>();
ArrayList<Integer> result = new ArrayList<>();

for(int i = 0; i < nums1.length; i++){
    record.add(nums1[i]);
}

for(int i = 0; i < nums2.length; i++){
    if(record.contains(nums2[i])){
        result.add(nums2[i]); // 可能重复
    }
}

// 将 ArrayList 转数组
int[] res = new int[result.size()];
for(int i = 0; i < result.size(); i++){
    res[i] = result.get(i);
}

3️⃣ 遇到的问题

  • ArrayList 会重复加入相同元素,结果可能是 [2,2]

  • 不符合题目要求"结果不重复"


二、第二次尝试 --- 全部用 Set

思路

  • HashSetnums1 元素 → 快速查找

  • HashSet 存交集结果 → 自动去重

  • 最后将结果 Set 转成数组

代码

java 复制代码
Set<Integer> record = new HashSet<>();
Set<Integer> result = new HashSet<>();

for(int num : nums1){
    record.add(num);
}

for(int num : nums2){
    if(record.contains(num)){
        result.add(num); // 自动去重
    }
}

// 尝试用普通 for 循环遍历 Set
int[] res = new int[result.size()];
for(int i = 0; i < result.size(); i++){
    // ❌ 错误,Set 没有 get(i)
}

问题

  • Set 没有下标,不能用 get(i)

  • 需要换一种遍历方法


三、第三次尝试 --- 使用增强 for 循环(最终版)

思路

  • Set → 无下标 → 使用增强 for 循环遍历

  • 同时保持自动去重,顺序无关

代码(最终版)

java 复制代码
Set<Integer> record = new HashSet<>();
Set<Integer> result = new HashSet<>();

for(int num : nums1){
    record.add(num);
}

for(int num : nums2){
    if(record.contains(num)){
        result.add(num);
    }
}

// Set → int[] 使用增强 for 循环
int[] res = new int[result.size()];
int i = 0;
for(int num : result){
    res[i++] = num;
}
return res;

收获

  • 增强 for 循环可以遍历 任何实现 Iterable 的集合,不依赖索引

  • HashSet 自动去重,保证结果不重复

  • ArrayList 只在第一次尝试时用过,可变数组概念清楚


四、集合方法总结

数据结构 常用方法
Map get / put / containsKey
Set add / contains
List add / contains / get(index)

五、刷题经验总结

  1. 可变数组 → ArrayList

  2. 无重复快速查找 → HashSet

  3. Set 转数组 → 使用增强 for 循环

  4. 刷题流程:注释写在代码上方,说明"做什么 / 为什么",便于回顾

相关推荐
爱刷碗的苏泓舒22 分钟前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
维天说1 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19941 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品2 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘2 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记3 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
烬羽3 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
糖果店的幽灵3 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
闪电悠米3 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法