最大子数组和
https://leetcode-cn.com/problems/maximum-subarray/
动态规划
构建 DP 数组:dp[i]
存储以 nums[i]
为结尾的最大子数组和,不用关心这个数组是从哪里开始的。如果 nums[i-1]
已被计算出,则对于 nums[i]
只有 2 种情况:要么连接上前面的子数组,要么自己成为一个子数组。取最大的即可。最后遍历 DP 数组,得到最大子序列长。
base case: 第一个元素前面没数组了,以它结尾的最大和就是它自己。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| func maxSubArray(nums []int) int { dp := make([]int, len(nums))
dp[0] = nums[0]
for i := 1; i < len(nums); i++ { dp[i] = max(dp[i-1] + nums[i], nums[i]) }
res := math.MinInt16 for _, v := range dp { res = max(res, v) } return res }
func max(a int, b int) int { if a > b { return a } return b }
|