给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
来源:力扣(LeetCode)
解决动态规划问题 主要分为以下三步:
- 目标(objection)
- 定义状态(define status)
- 转化方程(transform equation)
下面和大侠一起分析下这个问题吧!
目标 :最大子序列和
定义状态:M(j)表示到j位置之前的最大子序列和
转化方程:
M [ j + 1 ] = { M [ j ] + n u m s [ j ] M [ j ] + n u m s [ j ] < n u m s [ j ] n u m s [ j ] e l s e M[j+1] = \begin{cases} M[j]+nums[j] & M[j]+nums[j]< nums[j] \\ nums[j] & else \end{cases} M[j+1]={M[j]+nums[j]nums[j]M[j]+nums[j]<nums[j]else
在初始位置:当前值和最大值都是 nums[0]
向下循环:如果当前子序和+nums[j]的值大于nums[j] ,说明nums[j]的加入,让整个序列和增加了。反之加入后,如果值小于nums[j] ,还不如直接让nums[j]作为新序列的开始。
下面是python 的代码实现:
def solution(nums):
if len(nums)==1:
return nums[0]
if len(nums)==0:
return -1
max_=current=nums[0]
for x in range(1,len(nums)):
current=current+nums[x] if current>0 else nums[x]
max_=current if current>max_ else max_
return max_
print(solution([4,-1,2,5]))