给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入:
numbers = [2, 7, 11, 15], target = 9
输出:
[1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
class Solution {
public int[] twoSum(int[] numbers, int target) {
int length = numbers.length;
// 0<index1<index2<length
int index1 = 0;
int index2 = length - 1;
int[] result = new int[2];
while(index1<index2){
//相加小于目标值,index1右移,对应数值增大
if(numbers[index1]+numbers[index2] < target){
index1++;
}else if(numbers[index1]+numbers[index2] > target){
//相加大于目标值,index2左移,对应数值减小
index2--;
}else{
//根据题目要求
result[0] = index1+1;
result[1] = index2+1;
break;
}
}
return result;
}
}
思路:
-
双指针
初始化两个指针,index1指向最小元素(该数组是有序数组),即index1指向数组第一个元素,index2指向最大元素(数组最后一个元素)
比较思路:
- 当两指针对应的值相加小于目标值,则移动index1指针,增大数值
- 当两指针对应的值相加大于目标值,则移动index2指针,减小数值
- 当两指针对应的数值相加等于目标值,则是最后结果