本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
初做LeetCode,就从LeetCode最经典也是最简单的一题开始。
题目描述:
给定一个整数数组nums和一个整数目标值target,从该数组中找出和为目标值的那两个整数,并返回它们所在的数组下标。
思路分析:
就是从一个数组中,找出两个数字,他们的和等于目标值。第一反应想到的就是for循环遍历,两遍for循环遍历数组,因为同一个数字不能和自己相加,第一遍从0开始,第二遍就从1开始循环下去,j起始一直处于i的后一位,两两相加比较。
虽然双重for循环在复杂度上略高,这里题目比较简单,也没那么复杂,直接两层for循环就可以了。如果不用两层for循环呢,单层for循环可以不可以解决?
代码
两重for遍历循环,用js实现的,论难度应该是比较简单的了。
const 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]
}
}
}
};
还有另一种方式,就是一层循环,用的是js Map数据结构,键值对的集合,遍历数组nums,i作为当前下标,通过map.has去判断 目标值减去当前下标值target-nums[i]所得结果 作为key是否包含在map里,如果不存在,则将当前下标对应的值和下标(nums[i],i)存入 map 中,如果存在,[map.get(target - nums[i]), i]即为返回的值。
const twoSum = function (nums, target) {
let map = new Map()
for (let i = 0; i < nums.length; ++i) {
if (map.has(target - nums[i])) {
return [map.get(target - nums[i]), i]
}
map.set(nums[i], i);
}
};
举个例子
nums=[1, 4, 3, 6, 11, 15] target=9
首先 i=0
9-1=8,map里没有这个key值,map存键值对(1,0),map里的数据(1,0)
继续 i=1
9-4=5,map依旧没有,存值(4,1),map里的数据(1,0),(4,1)
继续 i=2
9-3=6,map依旧没有,存值(3,2),map里的数据(1,0),(4,1),(3,2)
继续 i=3
9-6=3,map.has(3)为true,map里有3这个key,3对应的值为下标2,以及当前i=3
返回值[2,3]
总结
这个是LeetCode里最简单的题目,从难度系数来看是很简单,容易实现, 从简单入手,同时也要学会思考,有没有更好的方法去解决问题。