如何用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)