問題描述:求中和最大的子串行
演算法1:列舉法,複雜度為o(n^3)
演算法2:改進的列舉法,複雜度為o(n^2)int
maxsubarray_1
(const vector<
int>
&a)if
(this_sum > maxsum)}}
return maxsum;
}
演算法3:分治法,複雜度o(nlogn)int
maxsubarray_2
(const vector<
int>
& a)
}return maxsum;
}
最大子串行有三種可能出現的位置:序列的前半部分、後半部分和中間,前半部分和後半部分使用遞迴計算,中間部分分別從中間向兩邊查詢,三個部分中最大的序列即和最大子串行。
注意,在遞迴時,一定要記得寫遞迴終止條件,否則會無限的占用堆疊,出現stack overflow的錯誤。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;
}
演算法四:掃瞄法
只需要一次遍歷,遍歷的過程中把和為負的子串行拋棄
時間複雜度為o(n)int
maxsubarray_4
(const vector<
int>
& a)
return maxsum;
}
輸出結果:
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...