Map是两数之和最优解,因一次遍历边存边查,补数查找为O(1);它键支持任意类型、无隐式类型转换、无原型链干扰,比对象更安全高效。

用 JavaScript 的 Map 实现“两数之和”是标准解法,核心在于:**一次遍历中边存边查,把“找补数”变成 O(1) 操作**。
为什么 Map 比数组/对象更合适?
Map 保留插入顺序,键可以是任意类型(包括对象、函数),且查询、插入时间复杂度稳定为 O(1)。相比普通对象,它不会把数字键隐式转成字符串,也不存在原型链干扰(比如不小心继承了 hasOwnProperty 等方法),在算法题中更安全、语义更清晰。
核心思路:用 Map 存“值 → 下标”,边遍历边查补数
对每个数字 nums[i],计算补数 target - nums[i];如果 Map 中已存在该补数,说明之前某个位置的数和它能凑成目标值——直接返回两个下标。
- 遍历时,把
nums[i]作为 key,i作为 value 存入 Map - 每次先查
map.has(complement),再存当前值,避免同一元素被重复使用(如target = 6, nums = [3]) - 不用预先建好 Map,空间更省,逻辑更紧凑
标准代码实现(带注释)
```js
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i
const complement = target - nums[i];
if (map.has(complement)) {
return [map.get(complement), i]; // 补数下标在前,当前下标在后
}
map.set(nums[i], i); // 当前数存入,等待后续被匹配
}
return []; // 题目保证有解,这行实际不会执行
}
```
常见易错点提醒
- 别用
map[complement]查找——这是对象写法,Map必须用.has()和.get() - 别在循环开头就存当前值,否则可能用同一个元素两次(如
nums = [3,2,4], target = 6,i=0 时存了 3,接着又查到 complement=3,误返回 [0,0]) - 题目要求返回下标而非数值,Map 的 value 必须存索引
i,不是nums[i]


















