和为S的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
解题思路
这个是有序的数列,有序的东西,首先的第一步估计就是怎么去利用好这个东西吧,比如我们的二分搜索。之内的!还有个问题,如果有多对,输出乘积为最小的,这里我是有点蒙啦。
但是一旦想到了,利用前后进行夹逼,既然是前后的。一定存在最外围满足的乘积的最小 这个不用去证明,自己随便举个例子就晓得啦
我们看哈代码:
/**
* 左右的夹逼
* @param array
* @param sum
* @return
*/
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
int start = 0;
int end = array.length - 1;
while (start < end) {
if ((array[start] + array[end]) == sum) {
list.add(array[start]);
list.add(array[end]);
return list;
} else if ((array[start] + array[end]) > sum) {
end--;
} else {
start++;
}
/**
* 这里的左右的夹逼之后呢,我们的乘积最小的一定是最外面的相加的结果,其他的不用我们去考虑!
*/
}
return list;
}