演算法1 最大子串行和

2021-10-24 21:40:29 字數 2532 閱讀 6199

問題描述:求中和最大的子串行

演算法1:列舉法,複雜度為o(n^3)

int

maxsubarray_1

(const vector<

int>

&a)if

(this_sum > maxsum)}}

return maxsum;

}

演算法2:改進的列舉法,複雜度為o(n^2)

int

maxsubarray_2

(const vector<

int>

& a)

}return maxsum;

}

演算法3:分治法,複雜度o(nlogn)

最大子串行有三種可能出現的位置:序列的前半部分、後半部分和中間,前半部分和後半部分使用遞迴計算,中間部分分別從中間向兩邊查詢,三個部分中最大的序列即和最大子串行。

int

maxsubarray_3

(const vector<

int>

& a,

int left,

int right)

else

return0;

}int maxsum =0;

int maxleft =0;

int maxright =0;

int maxcenter =0;

int center =

(left + right)/2

; maxleft =

maxsubarray_3

(a,left,center)

; maxright =

maxsubarray_3

(a,center+

1, right)

;int maxcenterleft =0;

int centerleftsum =0;

for(

int i = center; i >= left; i--

)int maxcenterright =0;

int centerrightsum =0;

for(

int i = center+

1; i <= right; i++

) maxcenter = maxcenterleft + maxcenterright;

maxsum = maxleft;

if(maxright > maxsum)

if(maxcenter > maxsum)

return maxsum;

}

注意,在遞迴時,一定要記得寫遞迴終止條件,否則會無限的占用堆疊,出現stack overflow的錯誤。

演算法四:掃瞄法

只需要一次遍歷,遍歷的過程中把和為負的子串行拋棄

int

maxsubarray_4

(const vector<

int>

& a)

return maxsum;

}

時間複雜度為o(n)

輸出結果:

int

main()

;int num = a.

size()

; solution solution;

cout <<

"演算法1的輸出是:"

<

maxsubarray_1

(a)<<

'\n'

; cout <<

"演算法2的輸出是:"

<< solution.

maxsubarray_2

(a)<<

'\n'

; cout <<

"演算法3的輸出是:"

<< solution.

maxsubarray_3

(a,0

, num -1)

<<

'\n'

; cout <<

"演算法4的輸出是:"

提交leetcode.53

class

solution

//檢查全小於零的情況

效果並不理想,以後再改進

最大子串行和演算法

include stdio.h 演算法1 int maxsubsequencesum1 const int a,int n int thissum,maxsum,i,j,k maxsum 0 for i 0 i n i for j i j n j thissum 0 for k i k j k th...

最大子串行和演算法

題目 求a i 中和最大的子串行。時間複雜度o nlogn 使用分治 遞迴的方法。分別求出左邊n 2長度的最大子串行和 右邊n 2長度的最打字序列和 以及橫跨這兩部分且通過中間的最大和 要分別求出兩邊帶有最中間邊界的最子大序列和,將其相加 由於不是最簡單的方法,這裡不再贅述。時間複雜度o n 遍歷一...

演算法 最大子串行和

最大子串行和的問題,資料結構與演算法一書分析中給出了四種演算法,最優的演算法的時間複雜度為o n 1 定義控制台應用程式的入口點。2 34 include stdafx.h 5 include 6 using namespace std 7int maxsubsequesum const int a...