最大连续子序列问题

题目

53. Maximum Subarray

解法

方法一

curSum为包含当前值的连续序列最大值,如对序列nums[:i]curSum和中必定包含nums[i]

    def maxSubArray(self, nums):
        curSum = maxSum = nums[0]
        for num in nums[1:]:
            curSum = max(num, curSum + num)
            maxSum = max(maxSum, curSum)
        return maxSum

思路相同,另一种更为简洁的写法

    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            if nums[i-1] > 0:
                nums[i] += nums[i-1]
        return max(nums)

方法二

序列nums[k]可分为nums[0,1,...,s-1,s]nums[s+1,s+2,...k-2,k-1]两部分。
我们可以轻易求出前半部分nums[:s]的值,则后部分nums[s+1:k]=nums[:k]-nums[:s]

    def maxSubArray(self, nums) -> int:
        res = nums[0]
        msub = min(nums[0], 0)
        for i in range(1, len(nums)):
            new = nums[i - 1] + nums[i]
            res = max(new - msub, res, nums[i])
            msub = min(new, msub)
            nums[i] = new
        return res
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,402评论 0 2
  • 最大连续子序列问题 问题定义: 给定K个整数的序列{ N1, N2, ..., Nk },其任意连续子序列可表示为...
    HITMiner阅读 16,609评论 3 8
  • 如果在寒暑假的时候,你无聊的在街上走,随随便便拉住两三个过路的年轻人,里面起码有一个是学生。如果你恰好在北...
    沐风游阅读 589评论 1 6
  • 有人说,不要在该吃苦的年纪选择安逸。不知36岁的我还在不在吃苦的年纪里?想想自己如今已是人到中年,两个孩子的妈妈,...
    小乔韵味阅读 203评论 1 2
  • 本周最喜欢的一次输出活动: 酝酿并成功开展了一次读书会活动。 此次读书会,参会人员8人,都是孩子的妈妈或即将成为妈...
    向阳花开朵朵阅读 176评论 0 1