主题
复盘 · LC 1 两数之和(二刷)
题目
- 题号:LeetCode 1
- 名称:两数之和(Two Sum)
- 难度:Easy
- 链接:leetcode.cn/problems/two-sum
- 今日代码:
1-两数之和-二刷/index.js
题意
给定整数数组 nums 和目标值 target,返回两个不同下标,使对应元素之和等于 target。
- 恰好一组解;同一元素不能用两次。
- 返回顺序任意。
边界:负数、重复值([3,3] / 6)、答案在首尾。
涉及算法
| 标签 | 一句话 |
|---|---|
| 哈希表 | 边扫边查:target - x 是否已出现 |
| 排序 + 双指针 | 已排序或要保留下标时再考虑;本题不如 Map |
教程对照:03 · 先暴力再优化 · 两数之和。
首刷复盘(排序双指针有坑):2026-07-20 · 1。
评价我的解法
相对 7/20 的排序双指针,今天直接写出 Map 边走边查,说明补数模板已经进肌肉记忆。
我的代码(摘自 1-两数之和-二刷/index.js,不含本地测例):
javascript
var twoSum = function (nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const need = target - nums[i];
if (map.has(need)) {
return [i, map.get(need)];
}
map.set(nums[i], i);
}
return undefined;
};1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
对在哪:
- 先查后写:先问补数是否在 Map,再把自己放进去,不会误用同一下标。
- 一遍 O(n):每个下标只访问一次,查询摊还 O(1)。
糙在哪:
- 返回顺序:
[当前 i, 历史下标]能 AC(题目不要求顺序),口述时习惯说「先出现的下标在前」更顺。 - 找不到时
return undefined:题目保证有解;写成[]更贴近常见模板,也少歧义。
小结:二刷达标。和首刷比,工具从「排序夹逼」换成了本题正解 Map,这是正确升级。
最佳题解
与今日解同一套路,略整理返回值:
javascript
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const need = target - nums[i];
if (map.has(need)) return [map.get(need), i];
map.set(nums[i], i);
}
return [];
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 时间 O(n),空间 O(n)。
- 与你的代码实质相同;差别只在返回约定与空结果形态。
关联题目
| 题 | 为何相关 |
|---|---|
| 15. 三数之和 | 两数之和升级:排序 + 对撞 + 去重 |
| 167. 两数之和 II | 已排序,双指针才是正解 |
| 653. 两数之和 IV | 同一配对思想换到 BST / 哈希 |
一句话带走
两数之和:Map 存「值 → 下标」,边扫边查补数;排序双指针留给有序数组或三数之和。
