一、题目
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、 思路
思路1
- 加法我们首先要拿到第一个值,第一个值,我们可以采用遍历的形式拿到
- 但是拿到第一个值后,我们要紧接拿第二个值,第二个值不能拿第一位值,因此,在第二个循环中,应该加
1 - 拿到两个值后,我们做比较,判断是否相同,如果相同就返回当前两个坐标并加
1 - 如果不同,那就继续遍历第二位数,如果能找到就返回当前两个坐标,如果找不到,那么就换第一位数,再依次比较
思路2
双指针解法
- 定义左右指针left,right, left = 0, right = number.length -1
- 判断左指针的第一位加右指针的第一位是否等于target,
- 如果相加和大于target,那么左指针向左移动一位,
- 如果相加小于target,那么右指针向左移动一位
- 依次移动,直到得到下标
- 当前下标是从0开始的,所以左右各加1
三、代码
思路1
首先,我们要确定数组的长度
let len = numbers.length
然后遍历我们的第一位数
for(let i = 0; i < len; i++) {
let index1 = numbers[i]
....
}
拿到第一位数后,我们就要去遍历第二位数,第二位数要在第一位数下标上加1
for(let j = i+1; j < len; j++) {
numbers[j]
}
现在要判断他们是否等于目标值,如果等于就返回坐标加1
if(target == (index1+numbers[j])) {
return [i+1, j+1]
}
整体代码如下
let len = numbers.length
for(let i = 0; i < len; i++) {
let index1 = numbers[i]
for(let j = i+1; j < len; j++) {
if(target == (index1+numbers[j])) {
return [i+1, j+1]
}
}
}
思路2
let twoSum = function(numbers, target) {
console.log(numbers, target)
let left = 0, right = numbers.length - 1
while(left < right) {
let total = numbers[left]+numbers[right]
if(total < target) {
left++
} else if(total>target) {
right--
} else if(total === target) {
return [left+1, right+1]
}
}
return [left, right]
}