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

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000

提示:

  • 1 <= nums.length <= 3 * 104
  • -105 <= nums[i] <= 105

解1 2021/9/8 O(n)

def maxSubArray(nums: list) -> int:
    # 题目限制了nums长度至少1
    '''
    ### 错误 - 1
    原本是去掉头部<=0的,做着做着发现,while循环中也会跳过,
    感觉这一步是没有必要的,就删除了,
    然后发现,[-2,-1]错误答案,
    这一步还是要的
    '''
    # 去掉头部<=0的
    i=0
    tmp_max=nums[0]
    for i,v in enumerate(nums):
        if v>0: break
        tmp_max=max(tmp_max,v)
    if i==nums.__len__()-1 and nums[-1]<=0: return tmp_max
    nums=nums[i:]
    len=nums.__len__()
    # 某个位置,往后走,只要是加起来还是>=0的,就一直往后走
    tmp_max=nums[0]
    l=r=0
    while l<len:
        # 跳过<=0的
        while l<len and nums[l]<=0:
            l+=1
        r=l
        sum=0
        while r<len and sum>=0:
            sum+=nums[r]
            tmp_max=max(tmp_max,sum)
            r+=1
        l=r
    return tmp_max

if __name__ == '__main__':
    # 6
    nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
    print(maxSubArray(nums))
    # 1
    nums = [1]
    print(maxSubArray(nums))
    # 0
    nums = [0]
    print(maxSubArray(nums))
    # -1
    nums = [-1]
    print(maxSubArray(nums))
    # -100000
    nums = [-100000]
    print(maxSubArray(nums))
    ### 错误
    # 1
    nums = [-2,-1]
    print(maxSubArray(nums))
    nums = [-1,-2]
    print(maxSubArray(nums))
    nums = [-1,-2,3]
    print(maxSubArray(nums))

Leetcode - 53. 最大子序和_技术