38、和為S的兩個數字
阿新 • • 發佈:2019-01-01
題目:
輸入一個遞增排序的陣列 和 一個數字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; }