下面是使用 JavaScript 实现“两数之和”问题的一种常见解法,利用哈希表(Map)存储遍历过的数字和它们对应的下标,从而在一次遍历中完成查找。以下是详细的代码和说明:
function twoSum(nums, target) {
// 创建一个 Map 用于存放数字及其下标
const map = new Map();
// 遍历数组
for (let i = 0; i < nums.length; i++) {
// 计算当前数字所需要的补数
const complement = target - nums[i];
// 如果 Map 中存在这个补数,说明找到了答案
if (map.has(complement)) {
return [map.get(complement), i];
}
// 将当前数字及其下标存入 Map 中
map.set(nums[i], i);
}
// 根据题目的假设,每种输入一定有唯一答案
return [];
}
// 举例说明
const nums = [2, 7, 11, 15];
const target = 9;
const result = twoSum(nums, target);
console.log("下标结果为:", result); // 输出: 下标结果为: [0, 1]
代码解析
- 初始化 Map:使用
Map
存储数组中已遍历的数字和它们对应的下标。 - 遍历数组:对每个元素
nums[i]
:- 计算补数
complement = target - nums[i]
。 - 检查
complement
是否已存在于 Map 中。如果存在,则返回[map.get(complement), i]
,即补数的下标和当前数字的下标。 - 如果不存在,则将当前数字和下标存入 Map 中,供后续查找使用。
- 计算补数
- 返回结果:因为题目保证存在唯一解,所以在找到答案后直接返回。
复杂度分析
- 时间复杂度:O(n)。只需对数组进行一次遍历。
- 空间复杂度:O(n)。Map 最多存储 n 个元素。
这种方法充分利用了哈希表的快速查找特性,能够在一次遍历中高效地找到目标答案。