給你乙個整數陣列 nums ,請你找出乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
子陣列 是陣列中的乙個連續部分。
首先,這是乙個最優化問題,這裡的「優」指的是「最大和」
其次,此問題可分解成重疊子問題,設 f(i) 為 [0,i] 之間的連續子串的最大和。那麼整個陣列的連續子串最大和為:\(\max_\) 也即選取其中最大的 f(i)。
如何分解子問題?要想求解 f(i),得先求解 f(i-1),分解公式為:f(i) = max
為什麼是這個分解公式呢?根據以前求最長回文子串的解法,我一開始想到的是:f(i) = max 。求解最長回文子串參考:
這兩個公式有何區別?其關鍵點在「連續」二字上。f(i) = max 求解出來的 f(i) 並不一定是連續的子串之和。舉個例子:
nums = [2, 10, -1, 30],按 f(i) = max 求解出來的最大子串和為:
f(0)=2
f(1)=12
f(2) = max = 12
f(3)= max = 42
顯然,f(3)=42 計算出來的最大子串和並不是「連續」的!因為 f(3) 其實質上是忽略了 nums[2]=-1 這個值的。
f(i)的連續子串和,意味著:f(i) 要麼是從 f(i-1) 再加上第 i 個元素、要麼是直接從第 i 個元素開始,這樣才算是連續的,因此:max 才是最大連續子串和的分解式。它計算出來的結果如下:
f(0)=2
f(1)=12
f(2) = max = 11
f(3)= max = 41
class solution
//find max:找出 f(i) 的最大值,就是最大連續子串
int max = integer.min_value;
for (int i = 0; i < dp.length; i++)
}return max;
}}
最大子列和求解
題目如下 四種解題思路對應的完整 如下 最大子列和求解思路 include includeusing namespace std int maxsubseqsum1 int nums,int size int maxsubseqsum2 int nums,int size int maxsubseq...
利用分治法求解最大子陣列和
乙個陣列的最大子陣列和可能存在於三種情況中 1.該陣列的左子陣列中 2.該陣列的右子陣列中 3.可能橫跨左右子陣列 所以,我們可以將問題分解成乙個個的子問題,其中情況1和2可用遞迴求解,而情況3則需要計算 s1 max 1 i n 2 s2 max n 2 1 j n 其中情況3中s1必然包含了 s...
求乙個整型陣列的最大子陣列的和
團隊成員 遲真真 馮小蘭 求乙個整型陣列的最大子陣列的和 看到這個題目,是這樣想的 子陣列的元素個數為1個,2個,3個 n個 include define m 100 void main while n 0 比較相鄰2,3。n個相鄰元素時的最大值 if m max n printf 最大為 d ma...