原題地址: https://leetcode-cn.com/probl...
repo地址: https://github.com/pigpigever...
原文連接: http://www.javashuo.com/article/p-pkjiqubc-bh.html
給定一個整數數組 nums ,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
這道題其實能夠直接從題目提供的輸入輸出着手,對於輸入爲:[ -2, 1, -3, 4, -1, 2, 1, -5, 4 ]
的詳細分析以下:javascript
[ -2 ]
的狀況,那麼結果顯然是 -2
[ -2, 1 ]
的狀況,最程序化的比較固然是比較這三個結果的大小:-2
、 -2 + 1
和 1
的大小對不對?由於從黑盒的角度上看咱們並不能一眼看出結果,不過結果固然是 1
[ -2, 1, -3 ]
的狀況,咱們依然像一個機器人同樣列出來:-2
、 -2 + 1
、 -2 + 1 + (-3)
、 1
、 1 + (-3)
和 -3
,可是咱們注意到剛纔列出來的狀況裏面:-2
、 -2 + 1
和 1
都是 [ -2, 1 ]
裏的狀況,因此結論就是:求 [ -2, 1, -3 ]
的 「最大子序列和」 也就是求 [ -2, 1 ]
的 「最大子序列和」和 -3
之間的「最大子序列和」根據上面推導過程當中的結論咱們能夠把它概括成一個狀態轉移方程,定義以下: 前端
定義一個序列 S[i]
,存在元素爲 A[i]
,當 i = 0
時,S[0] = A[0]
;
當 i > 0
時, S[i] = max{S[i - 1] + A[i], A[i]}
java
/** * @param {number[]} nums * @return {number} */ var maxSubArray = function(nums) { const dp = [nums[0]], len = nums.length let max = dp[0] for (let i = 1; i < len; i++) { dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]) max = Math.max(dp[i], max) } return max };
不過這裏的空間複雜度能夠優化下👇git
/** * @param {number[]} nums * @return {number} */ var maxSubArray = function(nums) { let ans = nums[0], max = nums[0] for (let i = 1; i < nums.length; i++) { ans = Math.max(nums[i] + ans, nums[i]) nums[i] = ans max = Math.max(ans, max) } return max };
一直在 LeetCode 上刷題,以前還加入了組織,有興趣加入一塊兒學習的同窗能夠在下方留言或者關注個人微信公衆號「tony老師的前端補習班」並在後臺留言,能夠進羣跟大佬們一塊兒學習。github