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

Google面试题hasPairsWithSum:如何返回和为目标值的数对索引且时间复杂度低于O(n²)

实现方案

你原有实现的时间复杂度为O(n²):外层for循环遍历数组耗时O(n),内层array.find也需要遍历数组耗时O(n),嵌套后整体复杂度为O(n²),不符合性能要求。我们可以采用哈希表存储已遍历元素与对应索引的方案优化,整体时间复杂度可降到O(n),仅需一次数组遍历即可得到结果。

修改后完整代码
function hasPairsWithSum(array, sum) {
  // 边界判断:数组长度不足2不可能存在符合要求的数对
  if (array.length < 2) return null;
  // 哈希表存储已遍历元素:key为元素值,value为对应索引
  const numMap = new Map();
  for (let i = 0; i < array.length; i++) {
    const currentNum = array[i];
    // 计算当前元素的补数:目标和减去当前值就是需要匹配的另一个数
    const complement = sum - currentNum;
    // 补数已在哈希表中存在,直接返回两个数的索引
    if (numMap.has(complement)) {
      return [numMap.get(complement), i];
    }
    // 补数不存在则把当前元素和索引存入哈希表,供后续遍历判断
    numMap.set(currentNum, i);
  }
  // 遍历完成未找到符合条件的数对返回null
  return null;
}

console.log(hasPairsWithSum([1,2,4,4],8)); // 输出结果:[2, 3]
方案说明
  • 时间复杂度:仅遍历数组1次,Map的查询、写入操作都是O(1),整体复杂度为O(n),满足小于O(n²)的要求
  • 返回规则:存在符合条件的数对时,返回[第一个数的索引, 第二个数的索引]的数组;不存在符合条件的数对、或数组长度不足2时返回null,你也可以根据业务需求调整为返回空数组等其他值
  • 兼容性:ES6及以上环境支持Map,如果需要兼容更低版本JS环境,也可以把Map替换为普通对象实现相同逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:54:01