剑指Offer_42_和为S的两个数字

题目描述

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

输出描述:
对应每个测试案例,输出两个数,小的先输出。

解题思路

利用两个指针分别指数组开始和结尾,然后将两指针的值相加,大于给定值,那么尾指针向前移动,因为此时,如果移动开始指针,那么所有的值和结尾指针相加都大于给定值。同理,比给定值小,那么向后移动开始指针。与给定值相同的就是要找的值。

实现

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> list = new ArrayList<>();
        int f = 0, l = array.length - 1;
        int mlt = Integer.MAX_VALUE;
        while (f < l){
            int fn = array[f];
            int ln = array[l];
            if (fn + ln > sum){
                l --;
            }else if (fn + ln < sum){
                f ++;
            }else {
                if (fn * ln < mlt){
                    mlt = fn * ln;
                    list.clear();
                    list.add(fn);
                    list.add(ln);
                }
                f ++;
            }
        }
        return list;
    }
}
原文地址:https://www.cnblogs.com/ggmfengyangdi/p/5798233.html