如何根据目标值获取数组中两数之和对应的元素索引?
问题分析与解决方案
原代码的问题
你的代码逻辑完全偏离需求: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
相关产品推荐
相关产品推荐

