题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。返回值描述:对应每个测试案例,输出两个数,小的先输出。
###求解方法:双指针

1.初始化:指针l指向数组头, 指针r指向数组尾
2. 如果array[l] + array[r]== sum , 说明是可能解
3. 否则如果array[l] + array[r] > sum, 说明和太大,所以--r
4. 否则如果array[l] + array[r] < sum, 说明和太小,所以++l

注意:升序数组中,当最外层两个数和里层两个数和相等时,外层两个数乘积必然小于里层两个数

故题目即使要求输出乘积最小的两个数,用双指针法一旦找到外层和为sum就可直接返回,不必再找。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
        ArrayList<Integer> result = new ArrayList<>();
        if (array == null || array.length<2) {
            return result;
        }
        int l = 0;
        int r = array.length - 1;
        int mul = Integer.MAX_VALUE;
        while (l < r) {
            if (array[l] + array[r] < sum) {
                l++;
            } 
            if (array[l] + array[r] > sum) {
                r--;
            } 
            if (array[l] + array[r] == sum) {
                if (array[l] * array[r] < mul) {
                    mul = array[l] * array[r];
                    result.clear();
                    result.add(array[l]);
                    result.add(array[r]);
                    return result;
                }
            }
        }
        return result;
    }
}