P11-两数之和-有序数组-二分法/双指针算法
//两数之和-有序数组 /* * 给定一个升序排列的整数数组,从数组中找出两个数满足相加之和等于目标数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]; } }