题目
在一个有序数组中找到两个数,两个数之和为给定的一个数,返回两个数在数组中的下标。
原理
二分法
以第一个数为基准数,采用二分法寻找数组中与之相加等于给定数的数字,找到则返回下标,否则以第二个数为基准数,以此类推。
双指针
初始化两个指针,一个指向下标0,另一个指向最后一个数,让两个数相加,如果大于给定数,则右指针左移,否则左指针右移,直到找到和等于给定数的两个值,返回下标即可。
代码
二分法
public static void main(String[] args) {int[] indexArray = getIndexArrayByBinary(10, new int[]{1, 3, 4, 5, 6, 8});System.out.println(Arrays.toString(indexArray));}private static int[] getIndexArrayByBinary(int num, int[] arr) {for (int i = 0; i < arr.length; i++) {int n = arr[i], low = i + 1, high = arr.length - 1;while (low <= high) {int j = (high - low) / 2 + low;if (n + arr[j] == num) {return new int[]{i, j};}if (n + arr[j] > num) {high = j - 1;} else if (n + arr[j] < num) {low = j + 1;}}}return new int[0];}
双指针
public static void main(String[] args) {int[] indexArray = getIndexArrayByTwoPointer(10, new int[]{1, 3, 4, 5, 6, 8});System.out.println(Arrays.toString(indexArray));}private static int[] getIndexArrayByTwoPointer(int num, int[] arr) {int left = 0, right = arr.length - 1;while (arr[left] + arr[right] != num) {if (arr[left] + arr[right] > num) {right--;} else if (arr[left] + arr[right] < num) {left++;}}return new int[]{left, right};}