我要成为leetcode高手——1.两数之和(abandon)

354 阅读3分钟

经过几天对于JS的学习理解,相信你已经掌握了基本的循环语句,数组对象增删改查技能,现在你面前的是力扣第一题两数之和,请你来解开它吧😊

image.png

image.png

image.png

image.png

题目:

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

  • 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

  • 你可以按任意顺序返回答案。

示例 1:

输入: nums = [2,7,11,15], target = 9

输出: [0,1]

解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

总结一下,给了我们一个数组和一个整数目标值,想办法从数组中找出两个数相加对于目标值,如何返回它俩的下标?

image.png

有了,就像我们之前学的九九乘法表一样,通过运用for循环,遍历数组将所有数之间相加加加加...

oQy7sjEgDOAFlEMyAOxbrKffAjDEACAIbAOnUo.gif

nums = [2,7,11,15]

[2+7]

[2+11][7+11]

[2+15][7+15][11+15]

理论正确,开始行动

1.双重for循环:a + b = t

function twoSum(nums = [],target = 0){
    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]
  }
}
}

image.png

对了对了,马上运行看看效果!😝

image.png

image.png

时间复杂度

因为我们这里套了两层for循环,那么这里我们的时间复杂度就是O(n²),那既然之前的加法 a + b = t 所用时间太长,那我们就用减法a = t - b

image.png

Map

这里会用到新知识————Map类型

在JS中,

  • Map对象是一种用于存储键值对的数据结构
  • Map 中的一个键只能出现一次
  • 它在 Map 的集合中是独一无二的。
  • 和我们学的Object最明显的不同是Map对象允许任何类型的值(包括对象、函数等)作为键

创建Map,只需要使用new关键字即可:

let myMap = new Map()

添加键值对:可以使用set方法来向Map对象中添加键值对

let myMap = new Map()
myMap.set("key1", "value1")

获取键值对:使用get方法来获取与指定键对应的值

let myMap = new Map();
myMap.set("key1", "value1");
let value = myMap.get("key1");
 console.log(value); // 输出:value1

最后我们可以使用has方法来检查Map对象中是否存在指定的键

let myMap = new Map();
myMap.set("key1", "value1");
console.log(myMap.has("key1")); // 输出:true
console.log(myMap.has("key2")); // 输出:false

2.Map法:a = t - b

那么现在我们只需要把目标值tb相减,就只用把最后得到的a遍历整个数组去寻找是否有匹配的值,就能比双重for循环的暴力减法少了一层循环,这样它的时间复杂度就是O(N)

image.png

让我们在代码上实现看看

function twoSum(nums = [],target = 0){
let map = new Map()

for (let i = 0; i < nums.length; i++){
let aNum = target - nums[i]

// 判断map储存的值中有没有a
if(map.has(aNum)){

//有a, 就返回两个数的下标
return [map.get(aNum),i]
}
// 没有a,就把值和下标存储在 map里面
map.set(nums[i],i)
}
}

不多说,直接运行提交😊

image.png

image.png

那么恭喜,现在你已经掌握了两数之和的两种解法,请继续完成下面的题目吧😊😊

image.png