【Daily Interview】- 07 两数之和

203 阅读1分钟

题目

图片1
图片1

!! 题目来源:两数之和 - 力扣

分析

对于这个问题,最直接的思路是直接暴力的遍历数组,让两个数相加,如果得到结果,则返回下标,犹豫思路简单直接,所以下面直接给出代码:

const twoSum = function (nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      return nums[i] + nums[j] === target && [i, j];
    }
  }
};

进阶

上面的解法虽然简单直接,但复杂度较高,是 On2,有什么办法能够降低复杂度呢?

通常的思路是用空间换时间:

  • 创建一个集合
  • 每当我们遍历到一个数的时候,首先寻找与这个数匹配的对象是否在集合中
    • 如果存在,则直接返回结果
    • 而若不存在,则将与其匹配的结果存入集合中,以便后续查询

具体的,看看代码就很清晰了:

const twoSum = function (nums, target) {
  const residue = {};
  for (let i = 0; i < nums.length; i++) {
    const n = nums[i];
    if (n in residue) {
      return [residue[n], i];
    } else {
      residue[target - n] = i;
    }
  }
};

结果如下:

图片2
图片2