经过几天对于JS的学习理解,相信你已经掌握了基本的循环语句,数组对象增删改查技能,现在你面前的是力扣第一题两数之和,请你来解开它吧😊
题目:
-
给定一个整数数组
nums和一个整数目标值target,请你在该数组中找出 和为目标值 ——>target的那 两个 整数,并返回它们的数组下标。 -
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
-
你可以按任意顺序返回答案。
示例 1:
输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
总结一下,给了我们一个数组和一个整数目标值,想办法从数组中找出两个数相加对于目标值,如何返回它俩的下标?
有了,就像我们之前学的九九乘法表一样,通过运用for循环,遍历数组将所有数之间相加加加加...
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]
}
}
}
对了对了,马上运行看看效果!😝
时间复杂度
因为我们这里套了两层for循环,那么这里我们的时间复杂度就是O(n²),那既然之前的加法 a + b = t 所用时间太长,那我们就用减法a = t - b
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
那么现在我们只需要把目标值t和b相减,就只用把最后得到的a遍历整个数组去寻找是否有匹配的值,就能比双重for循环的暴力减法少了一层循环,这样它的时间复杂度就是O(N)
让我们在代码上实现看看
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)
}
}
不多说,直接运行提交😊
那么恭喜,现在你已经掌握了两数之和的两种解法,请继续完成下面的题目吧😊😊