给定一个整数数组
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))