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

2021-07-25 10:26:20 字數 901 閱讀 4230

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

牛客上有這樣一道題:

題目描述

輸入乙個遞增排序的陣列和乙個數字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)

else if(array[start]+array[end] > sum)else

}return ;

}module.exports = ;

求序列中和最大的的子串行

遍歷所有子串行,然後求出和最大的子串行 include int main void printf d d d max,p,q return 0 時間複雜度 o n 時間複雜度過高,不建議使用這種方法,建議使用方案2的方法 假設對2 5 8 1 3 4這個序列求和最大的字串 a 0 0則,後面的數加上...

求序列中最長遞增子串行的長度

include define maxnum 100 函式功能 求解序列中的最大遞增子串行的中包含的元素個數 演算法說明 用到了動態規劃問題,分解子問題b陣列是用來儲存每乙個子串行中的最大遞增子串行 求具有n個元素的序列中的最大遞增自序列問題分解為 a 0 a 0 a 1 a 0 a 1 a 2 a ...

801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...