剑指offer——和为S的两个数字
问题描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路分析
1.先判断输入数组的长度,若输入的数组个数小于两个数,或者为空,则返回这个数组。
2.由于数组是递增的,根据快速排序的思想,定义两个指针,一个指向数组开始,一个指向数组结尾。如:数组为2,3,4,5,6,7,8
2 3 4 5 6 7 8
^ ^
start end
情形一:
当s=9时,
start + end= 2 + 8 = 10 > 9
显然,保持end指针不动,右移start指针后的数相加都比9大。
所以,应保持start指针不动,左移end指针,即 end--
情形二:
当s=11时,
start + end= 2 + 8 = 10<11
同理,保持end指针不动,右移start指针,即 start++
情形三:
当s=10时,
start + end= 2 + 8 = 10
此时满足条件,将start和end指向的元素添加到list。
由于,按首尾向中间移指针的方法所找到的第一组数就是乘积最小,
如本题中:2*8 < 3*7 < 4*6,所以直接将添加完start和end的list输出即可。
代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList<Integer>();
if(array.length<2||array==null){
return list;
}
int start=0;
int end=array.length-1;
while(start<end&&array.length>0){
if (array[start]+array[end]<sum){
start++;
}
if (array[start]+array[end]>sum){
end--;
}
if(array[start]+array[end]==sum){
list.add(array[start]);
list.add(array[end]);
return list;
}
}
return list;
}
}