1. 程式人生 > >38、和為S的兩個數字

38、和為S的兩個數字

題目:

輸入一個遞增排序的陣列 和 一個數字S,在陣列中查詢兩個數,使得它們的和正好為S,如果有多對數字的和等於S,

輸入兩個數的乘積最小的。

解法:

1、證明:第一次找到的兩個數為兩個數的成績最小。因為是排序好的數字。假設a<b<c<d;

有a+d =b+c =10;即有第一個數為x,第二個數為(sum-x),且x<sum-x;

乘積y=x(sum-x),sum為一個已知數。要已知y最小,實際就是驗證一個開口向下的拋物線的初中數學問題。

即abs(sum/2-x)最大,乘積最小,即最左邊或最右邊出現的數就是最小的乘積。由於是排序陣列,所以第一次出現的即為最小乘積組合。

2、思想為利用兩個指標,左邊從索引0的元素開始,右邊從索引n-1的元素開始。從兩側縮小滿足條件的範圍即可。

程式碼如下:

    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> res;
        if(array.size()==0 || array.empty())
            return res;
        int left = 0;
        int right = array.size()-1;
        while(left<right)
        {
            if(array[left]+array[right] == sum)
            {
                res.push_back(array[left]);
                res.push_back(array[right]);
                break;
            }
            else if(array[left]+array[right] <sum)
                left++;
            else 
                right--;
        }
        return res;
    }