如何优化判断数组含目标值或两元素和等于目标值的算法性能
问题分析
你当前的功能实现逻辑是正确的,性能问题并不出在some方法本身——some的短路特性(找到符合条件的元素就立即终止遍历)其实是合理的,核心性能瓶颈来自some循环内部的array.slice(i+1).includes(x-item)操作:每次slice都会生成新的子数组产生额外开销,且includes需要遍历子数组查找元素,整体时间复杂度为O(n²),数组长度较大时性能会快速下降。
优化方案
最优的优化思路是用哈希集合存储已遍历过的元素,将查找补数的时间复杂度从O(n)降到O(1),整体时间复杂度降到O(n),空间复杂度为O(n),属于典型的空间换时间优化,且完全兼容负数元素场景。
优化后代码
function checkArray(x, array) { const seen = new Set(); for (const item of array) { // 匹配单个元素等于目标值的场景 if (item === x) return true; // 匹配两个元素和等于目标值的场景 const complement = x - item; if (seen.has(complement)) return true; // 把当前元素存入已遍历集合 seen.add(item); } return false; }
优化效果说明
- 全程只有一次遍历,满足条件就立即返回,没有多余的数组生成和二次遍历操作
Set的has/add操作平均时间复杂度都是O(1),远优于原写法里的includes遍历- 天然支持负数元素,不需要额外的边界处理
- 如果你的使用场景中数组长度一直很小(比如长度低于10),两种写法感知差异几乎为0,不需要额外修改;如果数组长度经常超过100,优化后的写法性能会有数量级的提升。
内容的提问来源于stack exchange,提问作者Greed94
相关产品推荐
相关产品推荐

