描述给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要输出这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
你可以假设数组递增有序。请在O(N)时间内完成。例如:给出数组[2,7,11,15],以及目标target=9,则输出[0,1]
1 public class ArraySum { 2 public static void main(String[] args) { 3 int[] arr = {1,1,2,4,5,7,9,11,17,27,35,66,77,99,101}; 4 int num =6; 5 6 Map map1 = getSumToANum(arr,0,arr.length-1,num); 7 System.out.println("第一种方法:"); 8 map1.forEach((k,v)->{ 9 System.out.println("数组中和为"+num+"的组合为:arr["+k+"]和arr["+v+"]的组合"); 10 }); 11 } 12 13 /** 14 * 第一种方法: 15 * @param array 16 * @param start 17 * @param end 18 * @param num 19 * @return 20 * 将有序数组的最小值与最大值进行相加后,与给定数进行比较, 21 * 如果相等,则在数组中找出两个数之和等与给定数; 22 * 如果小于给定数,则从小的位置向后移,在进行比较; 23 * 如果大于给定数,则从大的位置向前移,在进行比较; 24 * 如果直到开始位置大于结束位置时还没有找到这样的两个数时,输出不存在。 25 * 复杂度为O(n)。 26 * 27 */ 28 public static Map<Integer, Integer> getSumToANum(int[] array, int start, int end, int num){ 29 Map<Integer,Integer> map = new HashMap<>(); 30 while (start <= end){ 31 if (num == (array[start]+array[end])){ 32 map.put(start,end); 33 start++; 34 }else if (num > (array[start]+array[end])) 35 start++; 36 else 37 end--; 38 } 39 return map; 40 } 41 42 }
测试结果: