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