动态规划(1)连续子数组的最大和

动态规划(1)连续子数组的最大和

题目

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

示例1:

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

解题思路

思想:动态规划
逻辑分析:

  1. 子问题
    设动态规划列表dp,dp[i] 代表以nums[i]为结尾的连续子数组最大和。

    在该子问题的基础之上通过分别计算dp[i]和dp[i-1]的和即可依次得到前2,3…n项和。
  2. 转移方程
    当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)
展开阅读全文
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值