演算法學習 3 最大子陣列和以及高階問題

2021-07-24 14:58:48 字數 1020 閱讀 6998

題目:求子陣列最大和

3 -2 1 -6 3 2 -1 3

方式及原理

用cur記錄累加和,累加和為負數的話就清零,否則一直加下去,同時每次用result於cur比較,記錄cur出現過的最大值。例如上面的例子cur更新和result更新結果如下:

cur:

3 1 2 0 3 5 4 7

result

3 3 3 3 3 5 5 7

最後返回result即可。

原理解釋:假設最大和子陣列為t,那麼他字首肯定不為負(如果為負那麼去掉它就可以找到比他大的了),如果字首不為負當然希望它一直加下去。

題目 :求乙個陣列任意倆個不重疊的子陣列的累加和的最大值

3 -2 1 -6 4 3 -2 3
l 3 3 3 3 4 7 7 8

r 8 8 8 8 8 4 3 3

方式及原理

是求出從左到右每個位置的左半部能取到的子陣列的最大值,然後再求出從右到左每個位置右半部能取到的子陣列的最大值,而這倆個不重疊的子陣列肯定是以每乙個位置為分割的,每個位置上述倆者和最大的即為所求的結果。

實際只要先用乙個陣列記錄從右到左的子陣列的最大值即可,從左到右的我們本來就要遍歷一次,不需要多遍歷一次。

題目:求未排序陣列中累加和為給定值k的最長子陣列系列問題(時間複雜度o(n))

2 3 1 1 1 1 1 3 2
方式及原理

設立left,right倆個指標,初始位置都在最左邊的位置,然後計算倆個指標之間的數字的和tem_sum,如果tem_sum<=k,right指標++,如果tem_sum>k,left指標++,並且如果在tem_sum ==k時,計算left到right的長度並跟新到man_len儲存即可。

原理是因為假設存在這麼乙個最長的和為定值k的子串行,我這麼做肯定不會錯過它,首先是right指標會逐漸到達這個存在了的子串行的右邊,然後left也會慢慢過來,自己體會哈哈~

演算法學習 最大子段和

求乙個陣列的最大子段和 1.列舉法 時間複雜度o n2 2.遞推法 時間複雜度o n include include include include include define len 10 typedef int intp typedef int intpp using namespace st...

演算法導論3 最大子陣列問題 2016 1 3

頂著期末複習的壓力,還是在今天過完之前看完了乙個演算法 最大子陣列問題。演算法導論 中引入這個問題是通過 的購買與 經過問題轉換 換的過程比較簡單,但是不好想 將前一天的當天的 差價重新表示出來,即轉為了乙個最大子陣列的問題 具體內容是 13,3,25,20,3,16,23,18,20,7,12,5...

演算法學習筆記(一)求解最大子串行和的問題

問題 給定乙個有n n 1 個整數的序列,求出其中最大連續子串行的和 在這個問題中,我給出幾種做法。方法一 暴力 來兩個迴圈,將所有的可能情況都考慮到,再求出最大值 1 int maxvalue int data,int length 217 18 19 20return maxdata 21 方法...