leetcode:动态规划:53.最大子序和

题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例

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

输入:nums = [0]
输出:0

假设有数组长度为 n n n,下标我们记为 0 0 0 n − 1 n-1 n1,最大子序和我们记为 f m a x s u b f_{maxsub} fmaxsub,那么我们得到:
f m a x s u b [ 0 ] f_{maxsub[0]} fmaxsub[0]
f m a x s u b [ 0 → 1 ] f_{maxsub[0\to1]} fmaxsub[01]
f m a x s u b [ 0 → 2 ] f_{maxsub[0\to 2]} fmaxsub[02]
. . . ... ...
f m a x s u b [ 0 → n − 1 ] f_{maxsub[0\to n-1]} fmaxsub[0n1]
然后比较每个长度的最大子序列和,就可以了。
接下来是不同长度子序列和的计算,我们可以从0开始算起,后面的加上去比较,取最大值,当加上去为负数的时候,说明前面的子序列和可以抛弃(因为 负A+正B<正B),这时继续往下算。最后可以得到最大的子序列和。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        calSum = nums[0]
        maxSum = nums[0]
        for i in range(1, len(nums)):
            if calSum > 0:
                calSum += nums[i]
                maxSum = max(calSum, maxSum)
            
            else:
                calSum = nums[i]
                maxSum = max(calSum, maxSum)
        return maxSum           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值