当前位置: 首页 > news >正文

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

题目描述

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

示例:

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


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

1️⃣ 思路

  • ArrayList 存结果(可变数组)

  • HashSetnums1 元素,方便快速查找

2️⃣ 代码尝试

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 转成数组

代码

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 循环遍历

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

代码(最终版)

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 只在第一次尝试时用过,可变数组概念清楚


四、集合方法总结

数据结构常用方法
Mapget / put / containsKey
Setadd / contains
Listadd / contains / get(index)

五、刷题经验总结

  1. 可变数组 → ArrayList

  2. 无重复快速查找 → HashSet

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

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

http://www.xdnf.cn/news/1478827.html

相关文章:

  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
  • 云手机在企业办公中的作用
  • [论文阅读] 软件工程 - 需求工程 | 2012-2019年移动应用需求工程研究趋势:需求分析成焦点,数据源却藏着大问题?
  • Linux内核网络子系统框架介绍
  • STM32----W25QXX
  • Long-VLA:释放机器人长范围操作视觉-语言-动作模型的能力
  • 【HEMCO Reference Guide 参考指南第二期】配置文件的结构和语法
  • 贪心算法应用:3D打印支撑结构问题详解
  • 大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化
  • Qt对话框与文件操作学习
  • Transformer 架构的演进与未来方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四讲笔记
  • 如何快速屏蔽红黄区偷偷上互联网呢
  • 为什么服务器有主备BMC?
  • Maven的介绍及基本使用
  • Springboot集成minio实现文件上传与下载
  • Go基础(②Viper)
  • 安装MATLAB205软件记录
  • 【Linux】Linux环境基础开发工具使用
  • clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性
  • Nginx停止脚本命令
  • 性能优化的边界-不该优化什么
  • PostgreSQL三种关闭方式的区别
  • 详解文件操作
  • 数据库集群分类详解
  • 【Java】抽象类和接口对比+详解
  • Altium Designer(AD24)加载License文件方法
  • 计算机CPU的工作原理介绍
  • 抽成独立组件库:微前端架构下公共组件共享的最佳实践