不要小看每一道簡單的題,把細節做好,把每一道簡單的題做的漂亮,這就是一種能力。
牛客上有這樣一道題:
題目描述
輸入一個遞增排序的數組和一個數字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
};