leetcode-53

127 阅读1分钟

题目描述:具体描述见原题。简单来说就是求连续子数组和最大值。

解题思路:利用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。那么就从当前值开启新的子数组。明天七夕,祝天下有情人终成眷属。