两数之和(力扣167题)
给你一个下标从 1 开始的整数数组 numbers
,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。如果设这两个数分别是 numbers[index1]
和 numbers[index2]
,则 1 <= index1 < index2 <= numbers.length
。
以长度为 2 的整数数组 [index1, index2]
的形式返回这两个整数的下标 index1
和 index2
。
/**
* 解题思路:数组已经排序,可以使用滑动窗口算法,left指针在后,right在前,形成一个窗口
* 不断缩小窗口的大小来判断是否等于sum
*/
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left < right){
int sum = numbers[left] + numbers[right];
if (sum == target) {
// +1是因为数组下标从1开始
return new int[]{left + 1,right + 1};
}else if (sum < target){
// 缩小窗口让左边的数大一点
left++;
}else{
// sum > target,同样缩小窗口让右边的数更小一点
right--;
}
}
//没有和为target的
return new int[]{-1,-1};
}
}