剑指 Offer 42. 连续子数组的最大和

128 阅读1分钟

题目

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

分析

动态规划题目
假设dp[i]是以nums[i]结尾的最大子数组,如果dp[i-1]<0,则舍弃dp[i-1],如果dp[i]>0,则dp[i-1]+nums[i],可得状态转移方程:
dp[i] = max(nums[i],dp[i-1]+nums[i])

求出dp[i]最大值即可

边界条件

代码

func maxSubArray(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	maxDp := -101
	dpi := 0
	dpi1 := -101
	for i := range nums {
		dpi = int(math.Max(float64(nums[i]), float64(nums[i]+dpi1)))
		dpi1 = dpi
		if dpi > maxDp {
			maxDp = dpi
		}
	}
	return maxDp
}