剑指offer:和为S的两个数字
题意描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述
对应每个测试案例,输出两个数,小的先输出。
解题思路
一、思路一
因为数组是递增的,所以使用双指针,一个指向头部,一个指向尾部。
- array[start]+array[end] == sum,符合条件
- array[start]+array[end] > sum,end太大,end--
- array[start]+array[end] < sum,start太小,start++
第一组符合条件的start与end添加入list并返回(两数相差越大,乘积越小)
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(array == null || array.length < 2) return list;
int start = 0, 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;
}

浙公网安备 33010602011771号