剑指Offer42:和为S的两个数字(java)
参考牛客“马客(Mark)”的解答:https://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b?f=discussion
思路分析:
设两个指针l,r指向数组左右两端,向中间夹逼寻找。因为和一定的情况下相差越远,乘积越小,所以当第一次array[l]+array[r]等于sum时即可。
题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
相差越远乘积越小:设和为常量a,一个数为x,另一个数为a-x。乘积y可表示为y=x(a-x),进一步可配成y=-\((x-a/2)^{2}\)+\(a^{2}\)/4 画出图像可得出,函数先升后降,在x=a/2时取乘积最大值,因此x与a-x相差越大,乘积越小。
Java代码:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int l =0;
int r =array.length-1;
ArrayList<Integer> result =new ArrayList<Integer>();
if(array==null||array.length<2){
return result;
}
while(l<r){
int temp=array[l]+array[r];
if(temp==sum){
result.add(array[l]);
result.add(array[r]);
break;
}
else if(temp<sum){
l++;
}
else{
r--;
}
}
return result;
}
}