题目
!! 题目来源:两数之和 - 力扣
分析
对于这个问题,最直接的思路是直接暴力的遍历数组,让两个数相加,如果得到结果,则返回下标,犹豫思路简单直接,所以下面直接给出代码:
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;
}
}
};
结果如下: