【题目】
输入一个递增排序的数组和一个数字s,在数组中找两个数,使得他们的和刚好是s.如果有多对数字的和等于s,则输出任意一对即可。例如,输入数组{1,2,4,7,11,15}和数字15,则输出4和11(4+11=15)。
【思路】
其实找的就是数组最两侧满足和为S的数字,因为:
z=xy
x+y=s
z=x(s-x)=sx-x^2 函数图像为向下开口的抛物线,两段数值小中间大。所以取两边的值。即:第一次找到就是最小的积了。
【代码】
public static void main(String[] args) {
int[] arr={0,1,2,4,7,11,15};
ArrayList<Integer> list=findNumberWithSum(arr,15);
System.out.println(list.get(0));//0
System.out.println(list.get(1));//15
}
//和为S的两个数
public static ArrayList<Integer> findNumberWithSum(int[] arr,int sum){
ArrayList<Integer> list=new ArrayList<Integer>();
if(arr==null||arr.length==0){
return list;
}
int i=0;
int j=arr.length-1;
while(i<j){
if(arr[i]+arr[j]==sum){
list.add(arr[i]);
list.add(arr[j]);
break;
}else if(arr[i]+arr[j]<sum){
i++;
}else{
j--;
}
}
return list;
}