如何优化实现两数之和功能的JavaScript代码,使其更高效简洁?
两数之和实现方案优化
原有代码存在的问题
先梳理下你当前写法的缺陷,后续优化可以避开这些问题:
let copyArray = arr是引用赋值,没有拷贝原数组,执行pop会直接修改传入的原数组,产生意料之外的副作用- 补数计算逻辑错误,不需要加
Math.abs,你要找的是和当前值相加等于target的数,正确补数应为target - 当前值,加绝对值会导致正负值的补数逻辑完全错误 pop方法不需要传参,永远删除数组最后一位,你传入的copyArray[i]完全无效,循环会漏查大量元素- 多次调用
includes、indexOf都是O(n)查询,整体算法时间复杂度为O(n²),数组长度较大时性能极差
更实用的高性能方案(推荐)
这是工业界通用的标准解法,用哈希表做空间换时间,时间复杂度降到O(n),无副作用,适配所有场景:
function targetSum(arr, target) { const numMap = new Map(); for (let i = 0; i < arr.length; i++) { const complement = target - arr[i]; if (numMap.has(complement)) { return [complement, arr[i]]; } numMap.set(arr[i], i); } return []; }
特点:一次遍历即可得到结果,处理万级以上长度的数组效率比原写法高数十倍,不会修改原数组
基于内置方法的精简代码版本
如果追求代码简洁,小数据量场景下可以用find+slice的内置方法组合压缩代码行数:
const targetSum = (arr, target) => { const match = arr.find((val, idx) => arr.slice(idx + 1).includes(target - val)); return match ? [match, target - match] : []; };
特点:仅3行代码,逻辑直观,不需要额外维护变量,适合快速实现的场景
内容的提问来源于stack exchange,提问作者Nahuel Valles
相关产品推荐
相关产品推荐

