You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据目标值获取数组中两数之和对应的元素索引?

问题分析与解决方案

原代码的问题

你的代码逻辑完全偏离需求:reduce在这里做的是累加操作,判断的是累加值和目标的关系,这和“找两个元素之和等于目标值的索引”完全不相关,只能在极少数巧合场景下得到错误的结果(比如目标为9时,原代码输出是[0],而非正确的[0,1])。

正确实现方案

我们需要实现一个通用函数,接收数组和目标值,返回符合条件的两个元素索引。以下是两种常用方案:

方案1:暴力枚举法(简单直观,适合小规模数组)

通过两层循环遍历数组,检查每一对元素的和是否等于目标值,找到后立即返回索引。

function twoSum(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  }
  return []; // 无符合条件的元素对时返回空数组
}

// 测试示例
console.log(twoSum([2, 7, 11, 15], 9)); // [0, 1]
console.log(twoSum([2, 7, 11, 15], 26)); // [2, 3]
console.log(twoSum([2, 7, 11, 15], 18)); // [1, 2]

方案2:哈希表法(时间复杂度O(n),效率更高)

通过哈希表存储遍历过的元素及其索引,遍历每个元素时,计算目标值 - 当前元素,检查哈希表中是否存在这个差值:

  • 如果存在,直接返回当前索引和差值对应的索引
  • 如果不存在,将当前元素和索引存入哈希表
function twoSum(nums, target) {
  const map = new Map();
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (map.has(complement)) {
      return [map.get(complement), i];
    }
    map.set(nums[i], i);
  }
  return [];
}

// 测试示例
console.log(twoSum([2, 7, 11, 15], 9)); // [0, 1]
console.log(twoSum([2, 7, 11, 15], 26)); // [2, 3]
console.log(twoSum([2, 7, 11, 15], 18)); // [1, 2]

关键说明

  • 两种方案都支持可变目标值,只需调用函数时传入不同的target参数即可
  • 哈希表法的时间复杂度为O(n),比暴力法的O(n²)效率高很多,适合处理大规模数组
  • 如果需要返回所有符合条件的索引对,只需修改逻辑,将结果存入数组而非直接返回

内容的提问来源于stack exchange,提问作者3gwebtrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:25:42