求最大子串行之和

2021-08-24 18:27:56 字數 1022 閱讀 1083

今天一下午在看sharepoint了,又有活幹,所以時間比較緊湊,於是想起了前些日子寫的求最大子串行之和,作為每日一小題吧,暫做自我安慰吧。

求最大子串行之和,主要要注意他的效率,

1,演算法複雜度是o( pow( n, 2 ) )

int max_sub(int a, int size) } } return max; }

2,演算法複雜度為o(n)

int max_sub2(int a,int size) return max; }

3,還從網上看了一種遞迴的「分而治之」( divide-and-conquer )的方法。(現在轉一下)

比如 4 -3 5 -2 -1 2 6 -2

first second

把序列分為兩部分,那麼最長子序列要麼在first,要麼在second,要麼就既在first又在second。

第一中情況只要求first的最大子串行(遞迴呼叫),第二中情況只要求second的最大子串行(還是遞迴呼叫)。對於第三種情況,只要找到包含first最後乙個元素(在例子中是2)在first的最大子串行(例子中是 4,-3,5,-2)和包含second起始元素(-1)在second的最大子串行(-1,2,6)然後相加就行了。

這種演算法的複雜度計算和計算斐波那契數列的複雜度相似,設 n 個數的執行次數是 t( n ) ,那麼 t( n ) = 2*t( n/2 ) + o( n ) 其中t( 1 ) = 1

o( n ) 可以看成 n ,那麼可以觀察得到 t( n ) = n * logn

int maxsumrec( const vector& a, int left, int right ) int maxrightbordersum = 0, rightbordersum = 0; for ( int i = center; i <= right; i++ ) return max3( maxleftsum, maxrightsum, maxleftsum + maxrightsum ); // 判斷三個數最大值的函式 } int maxsubsum3( const vector& a )

求最大子串行之和

摘要 給出乙個序列,求出其中連續的子串行中和最大的乙個。如 1 3 5 2 1 4 5 最大子串行之和是2 1 4 5 基本思路 最簡單的辦法就是遍歷一邊序列,用變數thissum記錄遍歷過的元素之和,當thisum 0時,繼續相加.若thisum 0,令thisum 0,吧下乙個元素作為新的子串行...

演算法心得 求最大子串行之和

上面就是題目內容 首先這種需要不斷用當前累加值和之前的最大的累加值做比較的題目,一般都是用動態規劃來求解的,因為你需要不斷的修改結果的最優解,最後得出最好的答案,這道題的動態規劃應該如何寫呢 1 因為需要不斷用當前累加值和之前的最大的累加值做比較,所以需要兩個變數,乙個是當前值sumnum,乙個是歷...

求最大子陣列之和

在乙個有n個元素的陣列中,其中每個元素的值可正可負,在該陣列中求乙個連續子陣列,使得該陣列的和最大 拿到這個題首先想到的是暴力法,即暴力迴圈求所有陣列的和,因此可以求的該陣列的最大值,其時間複雜度為o n 3 時間複雜度較高,我們可以用分治法和動態規劃來做這道題。其中分治法時間複雜度為o n log...