最大子序和 DP,分治

2021-08-29 20:28:39 字數 1720 閱讀 2814

給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

高階:如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。

以a[0]結尾的子串行只有a[0]

以a[1]結尾的子串行有 a[0]a[1]和a[1]

以a[2]結尾的子串行有 a[0]a[1]a[2] / a[1]a[2] / a[2]

……以a[i]結尾的子串行有a[0]a[1]……a[i-2]a[i-1]a[i]  / a[1]a[2]……a[i-2]a[i-1]a[i] /  

a[2]a[3]……a[i-2]a[i-1]a[i] / …… /  a[i-1]a[i] / a[i]

所有以a[0] ~a[n]結尾的子串行分組構成了整個序列的所有子串行。

這樣,我們只需求以a[0]~a[n]結尾的這些分組的子串行中的每一分組的最大子串行和。然後從n個分組最大子

序列和中選出整個序列的最大子串行和。

觀察可以發現,0,1,2,……,n結尾的分組中,

maxsum a[0] = a[0]

maxsum a[1] = max( a[0] + a[1] ,a[1])  = max( maxsum a[0] + a[1] ,a[1]) 

maxsum a[2] = max( max ( a[0] + a[1] + a[2],a[1] + a[2] ),a[2])  

= max(  max( a[0] + a[1] ,a[1]) + a[2] , a[2]) 

= max(  maxsum a[1] + a[2] , a[2])

……依此類推,可以得出通用的式子。

maxsum a[i] = max( maxsum a[i-1] + a[i],a[i])

只要上乙個子串行最大和為正,那麼無論當前值的正負,都會與當前的相加,這樣以當前值結尾的子串行最大

和就會增大。(乙個正數 加乙個 正數2 或者負數 那麼都會比這個正數2 或負數原來要增大,同理,乙個

負數加任何乙個數,都會使這個數減小,因此當前一子串行最大和小於零時,我們就歸零它了,相當於是不

加任何數,而保留當前位置值本身)

1.子串行必然以正數開頭

2.乙個子串行的前面的部分子串行之和必然為正數,若為負數就需要去掉

class solution else

if(max另外一種思路,分治法

子串行分為 左邊  右邊   跨左右

static int maxsubsum(int a ,int left,int right)

int mid = ( left + right ) / 2;

maxleftsum = maxsubsum(a,left,mid);

maxrightsum = maxsubsum(a,mid+1,right);

for(int i= mid ; i>=left;i--)

}for(int i= mid +1 ; i<=right;i++)

}return math.max(math.max(maxleftsum ,maxrightsum ),maxrightbordersum+maxleftbordersum );

}

dp 53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。暴力解決時間複雜度太高,用動態規劃 設sum i 為以第i個元素結尾且和最大的連續子陣列。假設對於元素i,所有以它前面的元素結尾的子陣列的長度都已經求得,那麼以第i個元素結尾且和最大的連續子陣列實際上,要...

暴力 分治 貪心 DP 最大子串行和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6 暴力 暴力列舉所有可能的連續子陣列,演算法複雜度o n 3 演算法1 1 int maxsubs...

最大子序和

演算法一 對這個問題,有乙個相對複雜的 o nlogn 的解法,就是使用遞迴。如果要是求出序列的位置的話,這將是最好的演算法了 因為我們後面還會有個 o n 的演算法,但是不能求出最大子串行的位置 該方法我們採用 分治策略 divide and conquer 在我們例子中,最大子串行可能在三個地方...