简单LeetCode 1动画补充中引导学习
两数之和
哈希表:边遍历边回看
边遍历边把"见过的数"记进哈希表:每遇到一个数,先回头查 target - 它是否见过——一次遍历搞定。
时间复杂度 O(n)空间复杂度 O(n)
题单:面试热题
题目描述
给定一个整数数组 nums 和一个目标值 target,请找出数组中和为 target 的两个数,返回它们的下标。每种输入只会对应一个答案,同一个元素不能使用两次。
学习目标
能把"找两个数"转成"对每个数找补数",说清哈希表为什么能把 O(n²) 降到 O(n),并写出先查后存的实现。
已完成 0 / 6 阶段
诊断
先找瓶颈
两数之和的暴力两层循环是 O(n²)。你觉得时间花在哪一步?
建议先完成当前阶段(提示 / 检查 / 自评),再进入下一步;也可以直接跳过。
解题思路
核心思想
边遍历边把"见过的数"记进哈希表:每遇到一个数,先回头查 target - 它是否见过——一次遍历搞定。
为什么需要它
暴力两层循环是 O(n²)。对每个数,真正想问的是"它的补数出现过吗"——这正是哈希表最擅长的问题(O(1) 查找)。
第一反应:直觉方案
双层循环枚举所有 (i, j) 组合,检查两数之和是否等于 target。
关键洞察
关键是把"找两个数"转成"对每个数找它的补数":遍历到 x 时只需要问一句"target - x 在不在表里"。而且边遍历边建表就够了——不用先把全部数字放进去,因为两个数必然一先一后遇到,后遇到的那个查表就能找到先遇到的。
时间复杂度 O(n)空间复杂度 O(n)
易错点
- 先查表、再存当前数——同一个元素不能和自己配对(顺序反了 [3,3] 会配出同一个 3)
- 表里存的是"值 → 下标",返回的是下标不是值
- 题目保证只有一个答案,不用考虑多解
参考代码
参考代码
1function twoSum(nums, target) {
2 const seen = new Map(); // 值 -> 下标
3 for (let i = 0; i < nums.length; i++) {
4 const x = nums[i];
5 if (seen.has(target - x)) {
6 return [seen.get(target - x), i];
7 }
8 seen.set(x, i);
9 }
10 return [];
11}
逐步演示
这道题目前是索引版:题面、解题思路与双语言代码已是完整内容; 逐步动画会按计划补充。