Leetcode刷题笔记37-最大子序和

1. 题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

2. 解答

python3

思路:只有之前的序列和为正数时,才进行累加,否则之前的清零,只算当前的元素。也有可能当前元素是负数,而之前的子序和为正数,那么新的子序和是小于之前的子序和的,所以需要每一次算完之后都更新最大值。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 1: return nums[0]
        local, max_sum = 0, -2**31
        for e in nums:
            if local > 0:
                local += e
            else:
                local = e
            if local > max_sum:
                max_sum = local
        return max_sum
nums = [-2,1,-3,4,-1,2,1,-5,4]
s = Solution().maxSubArray(nums)
print(s)

3. 优答

扫描二维码关注公众号,回复: 1614242 查看本文章

python3

方法1:思路参见博客https://blog.csdn.net/zl87758539/article/details/51676108

class Solution(object):
    def maxSubArray(self, nums):
        l = g = -2**31
        for n in nums:
            l = max(n, l+n)
            g = max(l, g)
        return g

方法2:空间开销比方法1大,思路是一样的。

class Solution:  
    def maxSubArray(self, nums):  
        """ 
        :type nums: List[int] 
        :rtype: int 
        """  
        length=len(nums)  
        for i in range(1,length):  
            #当前值的大小与前面的值之和比较,若当前值更大,则取当前值,舍弃前面的值之和  
            subMaxSum=max(nums[i]+nums[i-1],nums[i])  
            nums[i]=subMaxSum#将当前和最大的赋给nums[i],新的nums存储的为和值  
        return max(nums)  

方法3:思路是一样的,但是考虑了一种特殊情况,即列表中所有元素都为负数的情况。这是目前几个方法中的最优解。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if max(nums) < 0:
            return max(nums)
        global_max, local_max = 0, 0
        for x in nums:
            local_max = max(0, local_max + x)
            global_max = max(global_max, local_max)
return global_max

猜你喜欢

转载自www.cnblogs.com/Joyce-song94/p/9192250.html