53. 最大子序和

Tg:动规

第一次做法:对于从i开始的最大子序和,要么是nums[i]加上从i+1开始的最大子序和,要么是nums[i]自己(i+1的最大子序和小于等于0),故考虑从右侧往左侧遍历,算出最大子序和即可。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        l=len(nums)
        dp=nums[:]
        res=dp[-1]
        for i in range(l-2,-1,-1):
            dp[i]=max(dp[i],dp[i]+dp[i+1])
            res=max(dp[i],res)
        #dp[i]表示从i开始的最大子序和
        return res

评论区的:从头开始遍历,sum记录当前的子序和,若sum<0说明该段一定不需要,即结果最大子序和中一定不需要这一段小于0的(反证法易证),更新sum为当前元素,继续向后。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        l=len(nums)
        if not l:
            return 0
        sum=nums[0]
        res=nums[0]
        for i in range(1,l):
            if sum<0:
                sum=0
            sum+=nums[i]
            res=max(res,sum)
        return res

效率差不多,都是O(N)

posted @ 2019-08-06 16:42  NeoZy  阅读(88)  评论(0编辑  收藏  举报