两数之和II - 输入有序的数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
package exam;
import java.util.Arrays;
/*
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
*/
public class Solution13 {
//方法一:暴力法
// static public int[] twoSum(int[] numbers, int target) {
// int index1 = 0;
// int index2 = 0;
// for (int i = 0; i < numbers.length-1; i++) {
// for (int j = i+1; j < numbers.length; j++) {
// if(numbers[i]+numbers[j]==target){
// index1 = i;
// index2 = j;
// break;
// }
//
// }
// }
// int[] arr = new int[2];
// arr[0] = index1+1;
// arr[1] = index2+1;
// return arr;
// }
//方法二 Map映射
// static public int[] twoSum(int[] numbers, int target) {
// Map<Integer,Integer> map = new HashMap<>();
// for (int i = 0; i < numbers.length; i++) {
// map.put(numbers[i], i);
// }
// for (int i = 0; i < numbers.length; i++) {
// int num = target - numbers[i];
// if(map.containsKey(num)&&(i!=map.get(num))){
// return new int[]{i+1,map.get(num)+1};
// }
// }
// throw new IllegalArgumentException("No two sum solution");
// }
//方法三 双指针
// static public int[] twoSum(int[] numbers, int target) {
// int p = 0;
// int q = numbers.length-1;
// while (p!=q){
// if(numbers[p]+numbers[q]==target) {
// return new int[]{p+1,q+1};
// }
// else if(numbers[p]+numbers[q]>target){
// q--;
// }
// else {
// p++;
// }
// }
// return null;
// }
//方法四 二分法
static public int[] twoSum(int[] numbers, int target) {
for (int i = 0; i < numbers.length; i++) {
int low = i+1,high = numbers.length-1;
while (low<=high){
int mid = (high-low)/2 + low;
if(numbers[mid] == target - numbers[i]){
return new int[]{i+1,mid+1};
}
else if(numbers[mid]>target-numbers[i]){
high = mid-1;
}
else {
low = mid + 1;
}
}
}
return new int[]{-1, -1};
}
public static void main(String[] args) {
int[] arr = new int[]{2,3,4};
int target = 6;
System.out.println(Arrays.toString(twoSum(arr,target)));
}
}
四种解法,其中时间复杂度最低的为双指针解法,希望大家看了之后能有所收获。
题目来源于Leecode