问题描述:
输入一个升序排序的数组,给定一个目标值target,求数组的两个数a和b,a+b=target。如果有多个组合满足这个条件,输出任意一对即可。
例如,输入升序数组【1, 3, 4, 5, 13, 17】和目标值20。输出3和17。
分析:
最简单的办法,直接遍历,时间复杂度为O(n^2)。
双下标法:low和high
a[low]+a[high] < target, low++;
a[low]+a[high] > target, high–;
a[low]+a[high] == target, return low and high;
代码实现如下所示:
package oschina.IT100;
/**
* @project: oschina
* @filename: IT13.java
* @version: 0.10
* @author: JM Han
* @date: 12:08 PM 12/15/2015
* @comment: find two number in an incredent list whose sum is given
* @result:
*/
public class IT13 {
public static boolean findTwo(int[] arr, int sum){
int i = 0;
int j = arr.length - 1;
boolean flag = true;
while(flag && (i < j)){
if((arr[i] + arr[j]) < sum){
i++;
} else if ((arr[i] + arr[j]) > sum){
j--;
} else{
System.out.println("i: " + i + " j: " + j);
flag = false;
}
}
return flag;
}
public static void main(String[] args) {
int[] array = {1,3,4,5,13,17,18};
findTwo(array, 25);
}
}