算法,从简单刷起~1. 两数之和

197 阅读1分钟

本文首发于 语雀文档

题目

leetcode-cn.com/problems/tw…

流程图、调试代码

github.com/blueju/leet…/

第 1 次尝试(通过测试用例)

流程图

image.png

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    for (let i = 0; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                return [i, j];
            }
        }
    }
};

总结

通过测试用例

总的来说,很简单了,怎么说也是 leetcode 第一题。

第 2 次尝试(通过测试用例)

这题它不像其他题找最长组合之类的,而是比较单个值,所以这没办法只能一个个比较了,而我们能做的就是:看如何做到少遍历、少比较。 ​
所以我们想想有没有办法做到一次 for 循环搞定

其实在每一次比较时,我们都是知道当前项它需要多少才能达到 target,如果我们将还需要多少这个值存起来,后面的比较是不是就不再需要通过加加减减计算了,直接比较就完事了

流程图

image.png

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  let stack = {};
  for (let i = 0; i < nums.length; i++) {
    if (Object.prototype.hasOwnProperty.call(stack, nums[i])) {
      return [stack[nums[i]], i];
    } else {
      stack[target - nums[i]] = i;
    }
  }
};