求最大連續子串行和 分治法實現

2021-10-16 12:21:35 字數 1100 閱讀 7429

給定乙個整數陣列 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的子串行,繼...