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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jaster_wisdom/article/details/80662037

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

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

法一:动态规划,用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)

阅读更多
换一批

没有更多推荐了,返回首页