在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−
1a[
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那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子...