题目描述:具体描述见原题。简单来说就是求连续子数组和最大值。
解题思路:利用dp,dp[i]代表数组下标[0,i]内最大连续子数组和。状态转移方程是dp[i] = dp[i-1]+nums[i](num[i] > 0),dp[i] = nums[i](nums[i]<0)。具体过程见代码。
具体代码:
func maxSubArray(nums []int) int {
if len(nums) == 0 {
return 0
}
if len(nums) == 1 {
return nums[0]
}
dp, res := make([]int, len(nums)), nums[0]
dp[0] = nums[0]
for i := 1; i < len(nums); i++ {
if dp[i-1] > 0{
dp[i] = dp[i-1] + nums[i]
} else {
dp[i] = nums[i]
}
res = max(res, dp[i])
}
return res
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
补充说明:当考虑nums[i]时,dp[i]的值只有两种情况,如果dp[i-1]>0,那么就增加子数组长度。如果dp[i-1]<=0。那么就从当前值开启新的子数组。明天七夕,祝天下有情人终成眷属。