leecode:动态规划: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           

猜你喜欢

转载自blog.csdn.net/eight_Jessen/article/details/113573927