LeetCode刷题,两数之和

444 阅读2分钟

如何用Vscode愉快的刷LeetCode

leetcode有中国站点之后,刷题也变得更加方便了。但总用人不想用网页上给的编辑器解题,而习惯在诸如vscode这种常用的编辑器上解题。

vscode上刚好有这么个插件,可以让你方便的使用自己的账号在vscode上刷LeetCode的题目。简单说下这个插件的feature:

  • 登录/退出LeetCode账号
  • 在国际站和中国站之间切换
  • 以类别形式选择题目(困难度、公司、标签)
  • 对于题目讨论区和解答的编辑器快捷键
  • 关键字搜索题目

两数之和

题目内容

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

解法一,暴力破解

看完第一遍题目,可以非常自然的想到使用双层循环直接暴力计算。即挨个相加,判断是否等于目标值,如果等于则返回当前循环数的下标。但毫无疑问时间复杂度会比较高。

在暴力破解中的遇到的一个问题,最开始是直接使用两个forEach,但一直就无法通过submit。后面看了MDN文档才发现“除了抛出异常以外,没有别的办法终端forEach循环”,因此return 里的东西不会被return。

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]
            }
        }
    }
    // nums.forEach((e, i) => {
    //      nums.forEach((m, n) => {
    //          if (e + m === target) {
    //              return [i, n]
    //          }
    //      })
    // })
    // 除了抛出异常以外,没有办法中止或跳出 forEach() 循环。
    // 如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。 
    // 因此上述代码没用。
};

解法二,用对象巧取

思路:目前已知target值,且给定的数组一定会存在两个有效目标值。假定循环中的数值都可能成为答案,计算出目标值与当前循环数值的差。并且把当前数值的坐标以以数值为key下表为value的对象形式保存。在后面的某次循环中总会找到一个res在obj中了。此时,obj中的那个下表和当前循环的下标就是答案。

const twoSum = (nums, target) => {
const obj = {}
for (let i = 0, len = nums.length; i < len; ++i) {
        const data = nums[i]
        const res = target - data
        if (res in obj) {
            return [obj[res], i]
        }
        obj[data] = i
        console.log(i)
    }
}
twoSum([7, 2, 11, 16], 9)