动态规划(1)连续子数组的最大和
题目
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路
思想:动态规划
逻辑分析:
- 子问题
设动态规划列表dp,dp[i] 代表以nums[i]为结尾的连续子数组最大和。
在该子问题的基础之上通过分别计算dp[i]和dp[i-1]的和即可依次得到前2,3…n项和。 - 转移方程
当dp[i-1]>0时,dp[i]=dp[i-1]+nums[i]
当dp[i-1]<0时,dp[i]=nums[i]
其中的dp[i],dp[i-1]分别代表前i项和前i-1项的最大和,当前i-1项的最大和小于0时对于前i项和来说是负增益,所以令其为nums[i],反之则令其为dp[i-1]+nums[i]。
代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] += max(nums[i - 1], 0)
return max(nums)
拓展
若该题目要求不能改变原有数组,则需要使用一个参数来保存前i-1项的和。
代码如下:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
former = nums[0] //其中former保存nums[i-1]的值
for i in range(1,len(nums)):
nums[i] += max(former,0)
former = nums[i]
return max(nums)