输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
1. 规律
规律的话cur是用来存储当前的值之和,max1存储最大值,如果cur大于max1则更新,如果cur<0,并且nums[i]比cur大,则可以抛弃之前的数,重新开始计算cur;否则cur继续叠加nums[i]:因为如果cur>0,那么叠加(nums[i]>0)则能增大cur;即使(nums[i]<0),cur也不会影响到max1。反而如果cur先减少后增大,后面也可以继续更新max1。
class Solution(object):
def maxSubArray(self, nums):
max1 = nums[0]
cur = max1
for i in range(1, len(nums)):
if cur > max1:
max1 = cur
if cur < 0 and nums[i] > cur:
cur = nums[i]
else:
cur = cur + nums[i]
if cur > max1:
max1 = cur
return max1
2. 动态规划
class Solution(object):
def maxSubArray(self, nums):
for i in range(1, len(nums)):
if nums[i-1] > 0:
nums[i] += nums[i-1]
return max(nums)
动态规划,反正就是如果前面是负的,加上肯定更差。但是有可能后面还更差,所以要取max