这个问题是经典的两数之和问题,可以通过使用哈希表(JavaScript 中的 Map 或者对象)来解决。下面是一个 JavaScript 的解决方案:
function twoSum(nums, target) {
const numMap = new Map(); // 创建一个 Map 来存储数字及其索引
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i]; // 计算差值
if (numMap.has(complement)) { // 如果 map 中存在差值对应的键
return [numMap.get(complement), i]; // 返回两个索引
}
numMap.set(nums[i], i); // 存储当前数字及其索引到 map 中
}
return []; // 如果没有找到匹配的项,返回空数组
}
// 示例
const nums = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(nums, target)); // 输出 [0, 1],因为 nums[0] + nums[1] == 9
这段代码的工作原理如下:
- 遍历数组
nums
。 - 对于每个元素
nums[i]
,计算target - nums[i]
,这就是我们需要找的补数。 - 检查
complement
是否已经在numMap
中。如果是,则说明我们已经找到了解,直接返回这两个索引。 - 如果
complement
不在numMap
中,就将当前元素nums[i]
和它的索引i
加入到numMap
中,以便后续查找。 - 如果遍历结束都没有找到解,返回空数组。
这种方法的时间复杂度为 O(n),空间复杂度也为 O(n),其中 n 是数组 nums
的长度。这是因为最坏的情况下,我们需要遍历整个数组,并且可能需要在哈希表中存储所有元素。