题目
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为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
}