剑指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;
    }
}
posted @ 2020-02-02 13:50  31楼下小黑  阅读(119)  评论(0编辑  收藏  举报