lc053.最大子序和

 

题目链接

此题与jz042.连续子数组的最大和相同。可以用动态规划的思想解决该题。如果我们用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max[f(i)],其中0<=i < n。那么,我们可以用递归公示求f(i),当i=0或f(i-1)<=0时,f(i)就是数组中的第i个数字,如同上面的前面子数组和为负数的情况;如果i!=0并且f(i-1)> 0时,f(i)= f(i-1)+ nums[i]。虽然我们用递归的方式分析动态规划的问题,但最终都会基于循环去编码,这样写出来的代码如下。这个算法时间复杂度为O(N),空间复杂度为O(1)。

class Solution:
    def maxSubArray1(self, nums: List[int]) -> int:
        cursum, greatestsum = 0, float('-inf')
        for i in range(len(nums)):
            if cursum < 0:
                cursum = nums[i]
            else:
                cursum += nums[i]
            if greatestsum < cursum:
                greatestsum = cursum
        return greatestsum