输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
解题思路:首先想到的是,两个数相加之和是S,那么这两个数必定分布在sum/2的左右两边。此外,要求当有多对数字的和等于S,输出两个数的成绩最小的,那么就是输出最靠数组两端的数。证明:
a< b,a+b=S,那么S=(a-m)+(b+m)=ab-(b-a)m-m*m<ab;
那么问题就简单化了,其实就是从两端开始往中间遍历。
具体代码实现:
public class FindNumbersWithSum {
public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum){
ArrayList<Integer> list = new ArrayList<>();
if(array == null || array.length == 0){
return list;
}
int left = 0, right = array.length - 1;
while(left < right){
int total = array[left] + array[right];
if(total == sum){
list.add(array[left]);
list.add(array[right]);
return list;
}else if(total > sum){
right--;
}else {
left++;
}
}
return list;
}
}