動態規劃系列之 最大子序和

2021-10-25 00:24:50 字數 1393 閱讀 9159

53. 最大子序和

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

這道題不能用滑動視窗來做,因為陣列中含有複數,這樣就無法決定視窗的大小。

和為s的連續正數序列 中便用到了滑動視窗

思路可看官方題解,講的很清楚,這裡不再贅述…

也可參考 labuladong

方法一:動態規劃

class

solution

return res;

}}

時間複雜度:o(n)

空間複雜度:o(1)

方法二:分治法

class

solution

}public

intmaxsubarray

(int

nums)

public status getinfo

(int

a,int l,

int r)

int m =

(l + r)

>>1;

status lsub =

getinfo

(a, l, m)

; status rsub =

getinfo

(a, m +

1, r)

;return

pushup

(lsub, rsub);}

public status pushup

(status l, status r)

}

時間複雜度:時間複雜度為 o(n)

空間複雜度:遞迴會使用 o(logn) 的棧空間,故漸進空間複雜度為 o(logn)

「方法二」相較於「方法一」來說,時間複雜度相同,但是因為使用了遞迴,並且維護了四個資訊的結構體,執行的時間略長,空間複雜度也不如方法一優秀,而且難以理解。那麼這種方法存在的意義是什麼呢?

對於這道題而言,確實是如此的。但是仔細觀察「方法二」,它不僅可以解決區間[0, n - 1][0,n−1],還可以用於解決任意的子區間[l, r][l,r]的問題。如果我們把[0, n - 1][0,n−1]分治下去出現的所有子區間的資訊都用堆式儲存的方式記憶化下來,即建成一顆真正的樹之後,我們就可以在 o(logn) 的時間內求到任意區間內的答案,我們甚至可以修改序列中的值,做一些簡單的維護,之後仍然可以在 o(logn) 的時間內求到任意區間內的答案,對於大規模查詢的情況下,這種方法的優勢便體現了出來。這棵樹就是上文提及的一種神奇的資料結構——線段樹。

動態規劃之最大子序和(53)

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。題目求最大和,屬...

動態規劃之最大子矩陣和

分析 我們已經解決了一維的問題 基礎篇中的最大子段和問題 現在變成二維了,我們看看能不能把這個問題轉化為一維的問題。最後子矩陣一定是在某兩行之間的。假設我們認為子矩陣在第i行和第j列之間,我們如何得到i和j呢,對,列舉。列舉所有1 i j m,表示最終子矩陣選取的行範圍。我們把每一列第i行到第j行之...

最大子序和 動態規劃

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。def maxsubarray nums length len nums for i in ...