直接使用双指针,只是题目多加了一个限定,输出乘积最小的那一组。

public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        int l = 0, r = array.length-1;
        ArrayList<Integer> res = new ArrayList<>();
        int multiply = Integer.MAX_VALUE;
        while(l < r){
            int value = array[l]+array[r];
            if(value < sum)
                l++;
            else if(value > sum)
                r--;
            else {
                if(multiply > array[l]*array[r]){
                    multiply = array[l]*array[r];
                    res.clear();
                    res.add(array[l]);
                    res.add(array[r]);
                }
                l++;
                r--;
            }
        }
        return res;
    }

最后发现,其实两数距离最远的那一组的乘积最小,所以可以修改为下面的代码

public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {

        int l = 0, r = array.length-1;
        ArrayList<Integer> res = new ArrayList<>();
        while(l < r){
            int value = array[l]+array[r];
            if(value < sum)
                l++;
            else if(value > sum)
                r--;
            else {
                 res.add(array[l]);
                 res.add(array[r]);
                return res;
            }
        }
        return res;
    }