167. 两数之和 II - 输入有序数组 javascript
题目:
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例
:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
输入:numbers = [2,3,4], target = 6
输出:[1,3]
输入:numbers = [-1,0], target = -1
输出:[1,2]
代码1 本想着 检查 target - numbers[i] 看是否存在在数组中,但忽略了 indexOf 只能返回找到的第一个的索引值
var twoSum = function(numbers, target) {
// 返回两个数的下标值, 下标从1开始
let res = []
for(let i=0;i<numbers.length;i++){
let index = numbers.indexOf(target - numbers[i])
if(index!== -1) res.push(i+1,index+1)
break;
}
return res
};
错了 忽略了情况
代码2 双重循环
var twoSum = function(numbers, target) {
// 返回两个数的下标值, 下标从1开始
let res = []
for(let i=0;i<numbers.length;i++){
for(let j=i+1;j<numbers.length;j++){
if(target - numbers[i] === numbers[j]){
res.push(i+1,j+1)
break
}
}
}
return res
};
补充1:
代码3 对于代码1 后来想到可以用 lastInderOf ,这样的话可以从后往前找,可是超时了
var twoSum = function(numbers, target) {
// 返回两个数的下标值, 下标从1开始
let res = []
for(let i=0;i<numbers.length;i++){
let index = numbers.lastIndexOf(target - numbers[i])
if(index!== -1){
res.push(i+1,index+1)
break;
}
}
return res
};
补充2:
代码4 对于代码1 后来又想到也可以用 indexOf(‘xx’,n) ,这样的话可以 从 n 往后找
var twoSum = function(numbers, target) {
// 返回两个数的下标值, 下标从1开始
let res = []
for(let i=0;i<numbers.length;i++){
let index = numbers.indexOf(target - numbers[i],i+1) // 从 i+1开始,往后找
if(index!== -1){
res.push(i+1,index+1)
break;
}
}
return res
};