(環形)最大子串行和,Kadane演算法的字首和解釋

2021-10-06 16:24:03 字數 2004 閱讀 5957

在kadane演算法中,問題是求以下標i結尾的最大子串行和,換句話說,我們想找到cur

−pre

fcur-pref

cur−pr

ef的最大值,其中cur

curcu

r是[0,i

][0,i]

[0,i

]所有元素的和,pref是[0,

j]

[0,j]

[0,j

]所有元素的和,其中j

j<

i,所以想要cur

−pre

fcur-pref

cur−pr

ef最大,就是找到pre

fpref

pref

的最小值。

leetcode53.最大子序和

class

solution

return max;}}

;

傳統解法:

class

solution

return max;}}

;

環形子陣列的最大和

解決環形問題的常用解法就是拆成2∗n

2*n2∗

n的鏈狀解決,然後與之前的字首和求法類似,但是這裡限制了長度為n,所以需要使用單調佇列維護之前長度為n的動態的最小值。

class

solution

for(

int i =

1; i <=

2*n; i++)if

(res <0)

return res;

deque<

int> q;

q.push_back(0

);for(

int i =

1; i <=

2*n; i++

)while

(!q.

empty()

&& pre[q.

back()

]>= pre[i]

) q.

pop_back()

; q.

push_back

(i);

}return res;}}

;

這種環形的可以分為單區間和兩區間,單區間可以由kadane直接求出。

兩區間的是[

0...i]

+[j.

..n−

1],i

<

j[0...i]+[j...n-1],i[0

...i

]+[j

...n

−1],

i<

j,也就等價於∑i=

0n−1

a[i]

−min

(a[i

+1]+

⋯+a[

j−1]

)\sum_^a[i]-min(a[i+1]+\cdots+a[j-1])

∑i=0n−

1​a[

i]−m

in(a

[i+1

]+⋯+

a[j−

1]),也就等價於求中間一段子串行的最小值,用kadane演算法即可求出。需要注意的是因為是兩段區間,所以至少得有[

0...i]

[0...i]

[0...i

]或[j..

.n−1

][j...n-1]

[j...n

−1]。

class

solution);

}int

kadane

(vector<

int>

& a,

int l,

int r,

int mul)

return

(res == int_min ?

0: res);}

};

最大子數列問題之Kadane演算法

最大子數列問題的目標是在數列的一維方向找到乙個連續的子數列,使該子數列的和最大。例如,對乙個數列 2,1,3,4,1,2,1,5,4 其中連續子數列中和最大的是 4,1,2,1 其和為6。該問題最初是由ulf grenander教授在1977年提出的,直到1984年才由jay kadane提出了該問...

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...

最大子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...