LeetCode53. 最大子序和 (动态规划/分治法)

94 篇文章 6 订阅
35 篇文章 0 订阅

题目大意:求出一个序列的最大子序和,顾名思义,就是一段最大的连续序列的和

题目分析:本题可以用两种解法求解,动态规划或分治法

法一:动态规划,用result[i]保存以数字nums[i]结尾的最大子序和,然后不断更新result数组的最大值即可。总的时间复杂度O(n)

代码展示:

class Solution(object):
    def maxSubArray(self, nums):
        result = nums[:]
        maxSum = nums[0]
        for i in range(1,len(nums)):
            if result[i-1]>0:
                result[i] = nums[i] + result[i-1]
            if result[i]>maxSum:
                maxSum = result[i]
        return maxSum

法二:分治法,最大子序和要么在左半部分,要么在右半部分,要么就横跨两部分(即包括左半部分的最后一个元素,和右半部分的第一个元素)。返回这三种情况的最大值即可。第三种情况,其中包括左半部分最后一个元素的情形,需要挨个往前遍历,更新最大值。包含右半部分的第一个元素的情况类似。总的时间复杂度O(nlogn)

代码展示:

class Solution(object):
    def maxSubArray(self, nums):
        left = 0
        right = len(nums)-1
        maxSum = self.divide(nums,left,right)
        return maxSum
        
    def divide(self,nums,left,right):
        if left==right:
            return nums[left]
        center = (left+right)/2
        leftMaxSum = self.divide(nums,left,center)
        rightMaxSum = self.divide(nums,center+1,right)
        leftBorderSum = nums[center]
        leftSum = nums[center]
        for i in range(center-1,left-1,-1):
            leftSum += nums[i]
            if leftSum>leftBorderSum:
                leftBorderSum = leftSum
        rightBorderSum = nums[center+1]
        rightSum = nums[center+1]
        for i in range(center+2,right+1):
            rightSum += nums[i]
            if rightSum>rightBorderSum:
                rightBorderSum = rightSum
        BorderSum = leftBorderSum + rightBorderSum
        return max(leftMaxSum,rightMaxSum,BorderSum)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值