题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
解题-普通写法
首先看到第一个反应必然是遍历数组,先来个简单的写法,利用双层for循环进行遍历查出两个数
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]);
}
}
}
};
twoSum([2, 7, 11, 15], 9);//[0, 1]
解题-进阶写法
在我们看来上层的for循环实在是太不优雅的,如何改成单层for循环呢
那肯定是在一次循环中拿到 两个数的下标,这就需要我们在循环中把下标存下来,在找到符合要求的时候直接返回,话不多说上代码
var twoSum = function (nums, target) {
const map = {}
for (let i = 0; i < nums.length; i++) {
//一开始msp是为空的,判定空的肯定false
//因为数组的下标是从0开始所以map的值也是从0开始,所以要大于等于0
if (map[target - nums[i]] >= 0) {
return [map[target - nums[i]], i]
}
//然后将数值存为键,下标存为值,这样map中就会有内容,
//一旦有一个(target - nums[i]) 的结果就存在map中就表示找到了符合条件的两个数值
//例如9-7结果为2,而2就是我们一开始就存入map中的键,所以map[2]就能获取他的下标0
map[nums[i]] = i;
}
}
console.log(twoSum([2, 8, 11, 15, 7], 9));
这个写法的思路就是,将数组中的值和下标一起存储,并且用是用目标值减去数组中的项,在去map中找结果,因为我们在存map的时候是用数值作为键,所以只要在map中查找键是否存在,如果存在就获取对应的值,这个值就是我们要找的下标,最后返回结果