剑指offer编程题-输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

解题思路:首先想到的是,两个数相加之和是S,那么这两个数必定分布在sum/2的左右两边。此外,要求当有多对数字的和等于S,输出两个数的成绩最小的,那么就是输出最靠数组两端的数。证明:
a< b,a+b=S,那么S=(a-m)+(b+m)=ab-(b-a)m-m*m 那么问题就简单化了,其实就是从两端开始往中间遍历。
具体代码实现:

public class FindNumbersWithSum {
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum){
        ArrayList<Integer> list = new ArrayList<>();
        if(array == null || array.length == 0){
            return list;
        }
        int left = 0, right = array.length - 1;
        while(left < right){
            int total = array[left] + array[right];
            if(total == sum){
                list.add(array[left]);
                list.add(array[right]);
                return list;
            }else if(total > sum){
                right--;
            }else {
                left++;
            }
        }
        return list;
    }
}

你可能感兴趣的:(剑指offer编程题)