給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
tips:這裡的時間複雜度為o(nlogn),本題的思路是二分查詢法中學到的分治法,明確一點,連續子陣列在陣列**現的位置有三種,一種是中間,一種是左半部分,一種是右半部分,而左半部分和右半部分的求得又是與原始陣列的相同實現,於是將其分成乙個個小塊,最後逼近基線條件:只有乙個元素.若其大於零,則為元素本身,小於零則為零.注意遞迴過程中返回的是左邊,右邊,中間的最大值.
#include
intmaxsubsum
(int a,
int left,
int right)
/*基線條件*/
center=
(left+right)/2
; leftsum=
maxsubsum
(a,left,center)
;//遞迴呼叫,分的過程
rightsum=
maxsubsum
(a,center+
1,right)
;//遞迴呼叫,分的過程
for(i=center;i>=left;i--
)//求出中間靠左最大
for(i=center+
1;i<=right;i++
)//求出中間靠右最大
max=rightsum>leftsum?rightsum:leftsum;
max=max>
(maxleftbordersum+maxrightbordersum)
?max:maxleftbordersum+maxrightbordersum;
//三者最大
return max;
//返回值
}int
main()
;printf
("%d"
,maxsubsum
(b,0,8
));return0;
}
最大連續子串行和(分治法)
給n個數,要求n個數的最大連續子串行和。dp在o n 的時間內就能求出,很簡單。但這裡用分治的思想去做,複雜度是o nlogn 二分用了o logn 每次二分內的處理用了o n 將乙個序列對半切 mid 那麼這個最大連續子串行和要麼在 l,mid 要麼在 mid 1,r 要麼跨越兩邊。那麼就要求出 ...
分治法解最大連續公共子串行
這篇文章是在自學演算法導論練習的 直接入正題 最大連續子串行 分治法 原理 一串陣列可以對半分,一串陣列的最大連續子串行可能是在左端,右端以及跨越中間 依次遞迴分解求得最小塊的最大值,再向上組合成整段最大連續子串行 include includeusing namespace std int max...
使用分治法解最大連續子串行和問題
俺是菜鳥了解一下,這是我在演算法學習中的一些想法,如果有寫的不好的還請諒解,歡迎學習交流 3 問題 有長度為n的整數序列,求一段連續的子串行,要求該子串行的和為最大,並求出最大值。用分治法解決最大子串行和問題使用的是遞迴,它的思想是 1.將乙個長度為n的序列,一分為二變為兩個長度為n 2的子串行,繼...