一般考陣列的題目,重在挖掘數字時間的規律,只要找到規律就可以寫遞推關係式,很容易編寫基於迴圈的
或者是動態規劃的程式。
第一種解法:基於sum更新的解法
class solution
return summax;}};
第二種解法:自低向上的遞迴
使用動態規劃
f(i):以array[i]為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變
f(i)=max(f(i-1)+array[i] , array[i])
res:所有子陣列的和的最大值
res=max(res,f(i))
如陣列[6, -3, -2, 7, -15, 1, 2, 2]
初始狀態:
f(0)=6
res=6
i=1:
f(1)=max(f(0)-3,-3)=max(6-3,3)=3
res=max(f(1),res)=max(3,6)=6
i=2:
f(2)=max(f(1)-2,-2)=max(3-2,-2)=1
res=max(f(2),res)=max(1,6)=6
i=3:
f(3)=max(f(2)+7,7)=max(1+7,7)=8
res=max(f(2),res)=max(8,6)=8
i=4:
f(4)=max(f(3)-15,-15)=max(8-15,-15)=-7
res=max(f(4),res)=max(-7,8)=8
以此類推 ,,,,,,,,,,,,
class solution
return res;}};
上邊的也可以開闢 vectordp(size,0)
然後 每次計算結果都儲存在 dp[i]中,最後返回dp陣列中的最大值就好!
第三種解法:分治策略
分治策略,旨在將原先的大問題不斷分解成規模小的問題,比如求最大連續子陣列之和,先將原陣列以中間界線分為三部分,左邊是中界線左邊的元素,右邊是中界線右邊的元素,第三部分是兩邊都有分布的元素的集合,因為最大連續子陣列之和一定是這三部分之其中的乙個,所以最後比較這三部分中最大的,就是最大連續子陣列之和,也是該函式的返回值。而左邊、右邊的計算都繼續遞迴分治函式,直到只有乙個元素為止,而第三部分是以中間界線分別向左、向右連續相加,找出最大連續子陣列之和,這是最關鍵的一步。
迭代次數為n=(mid-low+1)+(high-mid),也是將原本o(n^2)演算法通過分治降為o(nlogn)的主要原因。
分制演算法的**也比較好理解,只是找三個最大值,同樣是基於遞迴進行分,然後合併的時候找中間的最大值!
求連續子陣列最大和
輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如輸入的陣列為 2,11,4,13,5,2 和最大的子陣列為11,4,13 因此輸出為該子陣列的和20。本題解法多種多樣,時間複雜度可以為 o n 3 o n 2 o ...
求連續子陣列的最大和
題目一 給定乙個陣列,求該陣列的最大子陣列和 與求最長連續子陣列互為姊妹題 題目二 給定乙個陣列,求該陣列的最大兩個子陣列的和 子陣列位置無重合 解題一 子陣列的最大和 技巧法 func getmaxsum arr int int res intmin cur 0 for ele range arr...
求連續子陣列的最大和
題目 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第3個為止 思路 從頭到尾逐個累加,儲存兩個值 當前和 最大和。public c...