本文首发于 语雀文档

题目

https://leetcode-cn.com/problems/two-sum/

流程图、调试代码

https://github.com/blueju/leetcode/

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

流程图

image.png

代码

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function (nums, target) {
  7. for (let i = 0; i < nums.length; i++) {
  8. for (let j = i + 1; j < nums.length; j++) {
  9. if (nums[i] + nums[j] === target) {
  10. return [i, j];
  11. }
  12. }
  13. }
  14. };

总结

通过测试用例

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

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

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

所以我们想想有没有办法做到一次 for 循环搞定

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

流程图

image.png

代码

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function (nums, target) {
  7. let stack = {};
  8. for (let i = 0; i < nums.length; i++) {
  9. if (Object.prototype.hasOwnProperty.call(stack, nums[i])) {
  10. return [stack[nums[i]], i];
  11. } else {
  12. stack[target - nums[i]] = i;
  13. }
  14. }
  15. };