主题
复盘 · LC 1 两数之和
题目
- 题号:LeetCode 1
- 名称:两数之和(Two Sum)
- 难度:Easy
- 链接:leetcode.cn/problems/two-sum
- 今日代码:
1-两数之和/index.js
题意
给定整数数组 nums 和目标值 target,返回两个不同下标 i、j,使得 nums[i] + nums[j] === target。
- 题目保证恰有一组解。
- 不能使用同一个元素两次。
- 返回顺序任意。
边界直觉:负数、重复值(如 [3,3]、target = 6)、答案在首尾。
涉及算法
| 标签 | 一句话 |
|---|---|
| 哈希表 | 边扫边问:target - x 见过没有? |
| 排序 + 双指针 | 先排序再左右夹;若要下标,必须带着原下标一起排 |
教程对照:03 · 先暴力再优化 · 两数之和。
评价我的解法
你的思路:把 { value, index } 排序,再用左右指针找和为 target 的一对。方向是对的——排序后双指针找配对很常见,且用对象包住下标,说明意识到「排序会打乱下标」。
我的代码(摘自 1-两数之和/index.js,不含本地测例):
javascript
var twoSum = function (nums, target) {
const newArr = [];
for (let i = 0; i < nums.length; i++) {
newArr.push({
value: nums[i],
index: i,
});
}
const arr = newArr.sort((a1, a2) => {
return a1.value - a2.value;
});
for (let i = 0, j = newArr.length - 1; i < arr.length, j > 0; ) {
const num1 = newArr[i].value;
const num2 = newArr[j].value;
if (target === num1 + num2) {
return [newArr[i].index, newArr[j].index];
} else if (target > num1 + num2) {
i++;
} else {
j--;
}
}
return [0, 0];
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
代码里有几处会让结果不稳或逻辑跑偏:
- 读错数组:
sort赋给了arr,循环里却读newArr。Array.prototype.sort会原地改newArr,碰巧多数用例还能过,但变量意图混乱,面试口述也说不清。 - 循环条件写错:
for (let i = 0, j = ...; i < arr.length, j > 0; )里逗号运算符只保留最后一个表达式,等价于几乎只看j > 0,不是标准的i < j。 - 复杂度:排序 O(n log n),不如一遍哈希 O(n)。本题最优解一般不走排序。
- 找不到解时返回
[0, 0]:题目保证有解,但返回假下标不如[]/ 抛错清晰。
小结:套路选得对(排序双指针),实现严谨度和「本题最优工具」还差一点。建议默写一遍 Map 版,再把排序双指针留到「已排序数组 / 三数之和」场景。
最佳题解
一遍遍历 + 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)。
- 为何更优:每个元素只看一次;配对查询摊还 O(1);不破坏原下标、不用排序。
若坚持双指针,正确骨架应是:映射 → 按值排序 → while (i < j) 比较和,命中后返回保存的原下标。时间和空间通常仍不如 Map。
关联题目
| 题 | 为何相关 |
|---|---|
| 15. 三数之和 | 排序 + 对撞双指针;两数之和的「升级」 |
| 167. 两数之和 II | 已排序,双指针才是正解 |
| 653. 两数之和 IV | 同一配对思想换到 BST / 哈希 |
一句话带走
两数之和面试优先讲:Map 边走边查补数;排序双指针留给「已经有序」或三数之和。
