给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
public class TwoSum { //暴力解法 public static int[] twoSumV1(int[] numbers, int target) { int[] result = new int[2]; if (numbers.length <= 1) { return result; } int temp; for (int i = 0; i < numbers.length; i++) { temp = numbers[i]; if (temp <= target) { for (int j = i + 1; j < numbers.length; j++) { if (temp + numbers[j] == target) { result[0] = i + 1; result[1] = j + 1; } } } } return result; } //二分法 public static int[] twoSumV2(int[] numbers, int target) { for (int i = 0; i < numbers.length; i++) { if (numbers[i] <= target) { int left = i + 1; int right = numbers.length - 1; //二分法查找temp值 while (left <= right) { int middle = (right - left) / 2 + left; if (numbers[middle] > target - numbers[i]) { right = middle - 1; } else if (numbers[middle] < target - numbers[i]) { left = middle + 1; } else { return new int[]{i + 1, middle + 1}; } } } } return new int[]{-1, -1}; } //双指针 public static int[] twoSumV3(int[] numbers, int target) { int startIndex = 0; int endIndex = numbers.length - 1; while (startIndex < endIndex) { int temp = numbers[startIndex] + numbers[endIndex]; if (temp > target) { --endIndex; } else if (temp < target) { ++startIndex; } else { return new int[]{startIndex + 1, endIndex + 1}; } } return new int[]{-1, -1}; } public static void main(String[] args) { int[] numbers = {-1, 0}; int[] ints = twoSumV3(numbers, -1); System.out.println(Arrays.toString(ints)); } }