題目:
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。
思考:遞增排序,從左往右數逐漸增大,而且不會出現重複的數字。當有多對數字和等於s的時候,如何選出乘積最小的那個呢?
說明一種情況,設有兩個數x, y。
若x為矩形的長,y為矩形的寬。當x + y 為定值時,怎麼樣才能使矩形的面積最大呢?
相信大家都知道是當矩形的長和寬相等的時候,矩形的面積最大。此時,矩形的面積為xy,就是這兩個數的乘積。
那麼,考慮極限情況,當x 和 y 中的某乙個數字為0時,x 和 y的乘積最小。
可以推廣開來得到,當x + y為定值時,|x - y| 的值越小,x 和 y 的乘積越大;|x - y| 的值越大,x 和 y 的乘積越小。———結論1
(推理的過程不是十分的嚴謹,不過結論是這樣的。用數學方法解決,就是另x + y = z; x * y = x * (z - x) = -
從最左邊的乙個數字開始,與最右邊的數字相加,如果相加的數大於所要得到的和,那麼繼續與次右邊的數相加。如果相加得到的數小於所要得到的和,就不在考慮左邊這個數字與其他數字的結合了。因為,左邊這個數字再與右側更小的數字結合,也不可能得到符合條件的數字。依次對每乙個左側的數進行這樣的操作,當找到符合條件的時,退出迴圈,返回結果。
class solution
else if(array[left] + array[right - i] > sum)
else
}left++;
}return solve;}};
和為S的兩個數字
題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸入 每個測試案例包括兩行 第一行包含乙個整數n和k,n表示陣列中的元素個數,k表示兩數之和。其中1 n 10 6,k為int 第二行包含n個整數,每個陣列均為i...
和為S的兩個數字
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。class solution public vectorfindnumberswithsum vectorarray,i...
和為s的兩個數字
輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。include using namespace std bool twonumberwithsum int data,i...