求遞增序列中和爲S的乘積最小的兩個數

不要小看每一道簡單的題,把細節做好,把每一道簡單的題做的漂亮,這就是一種能力。

牛客上有這樣一道題:

題目描述

輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,是的他們的和正好是S,如果有多對數字的和等於S,

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

輸出描述:

對應每個測試案例,輸出兩個數,小的先輸出


解題思路:

定義兩個指針start=0,end=array.length-1,s = array[start]+array[end],然後夾逼遍歷

1)s < sum,因爲是遞增序列,所以start++

2)s > sum, end--

3)s == sum, 在這個地方是可以優化的,普通的思路可能在這裏判斷乘積是不是小於之前的乘積,然後繼續

遍歷,其實因爲這個序列是遞增的,所以兩頭的乘積是最小的,及第一個s == sum就是我們所求的,證明如下:

x+y >= 2sqrt(x*y),

x*y <= ((x+y)/2)^2 = (sum^2)/4

y - x越大,乘積就越小,等號成立條件是x == y

下面附上代碼,因爲最近一直在學node,所以編程題都是用node來寫:

function FindNumbersWithSum(array, sum)
{
    // write code here
    if(array.length < 2)
        return [];
    var start = 0,
        end = array.length-1;
    while(start < end){
        if(array[start]+array[end] < sum){
            start++;
        }else if(array[start]+array[end] > sum){
            end--;
        }else{
            return [array[start],array[end]];
        }
    }
    return [];
}
module.exports = {
    FindNumbersWithSum : FindNumbersWithSum
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章