//两数之和-有序数组
/*
* 给定一个升序排列的整数数组,从数组中找出两个数满足相加之和等于目标数target
* 假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。
* 返回两数的下标值,以数组形式返回
* */
public class P11 {
public static void main(String[] args) {
System.out.println(Arrays.toString(point(new int[]{1, 2, 3, 4, 5, 6}, 10)));
}
//二分法
//先假定一个数解,然后找另一个解在不在数组中
public static int[] search(int[] numbers, int target){
for (int i=0; i<numbers.length; i++){
int low = i;
int high = numbers.length - 1;
while(low <= high){
int mid = (high + low) / 2;
if(numbers[mid] == target - numbers[i]){
return new int[]{i, mid};
}else if(numbers[mid] > target - numbers[i]){
high = mid - 1;
}else{
low = mid + 1;
}
}
}
return new int[0];
}
//双指针--更优解
//一个指针在首,一个指针在尾,如果 left+right > target,让right左移,
//left+right < target,left右移
public static int[] point(int[] numbers, int target){
int low = 0;
int high = numbers.length - 1;
while(low < high){
int sum = numbers[low] + numbers[high];
if(sum == target){
return new int[]{low, high};
}else if(sum > target){
high--;
}else{
low++;
}
}
return new int[0];
}
}