题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入:nums = [0]
输出:0
假设有数组长度为 n n n,下标我们记为 0 0 0到 n − 1 n-1 n−1,最大子序和我们记为 f m a x s u b f_{maxsub} fmaxsub,那么我们得到:
f m a x s u b [ 0 ] f_{maxsub[0]} fmaxsub[0]
f m a x s u b [ 0 → 1 ] f_{maxsub[0\to1]} fmaxsub[0→1]
f m a x s u b [ 0 → 2 ] f_{maxsub[0\to 2]} fmaxsub[0→2]
. . . ... ...
f m a x s u b [ 0 → n − 1 ] f_{maxsub[0\to n-1]} fmaxsub[0→n−1]
然后比较每个长度的最大子序列和,就可以了。
接下来是不同长度子序列和的计算,我们可以从0开始算起,后面的加上去比较,取最大值,当加上去为负数的时候,说明前面的子序列和可以抛弃(因为 负A+正B<正B),这时继续往下算。最后可以得到最大的子序列和。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
calSum = nums[0]
maxSum = nums[0]
for i in range(1, len(nums)):
if calSum > 0:
calSum += nums[i]
maxSum = max(calSum, maxSum)
else:
calSum = nums[i]
maxSum = max(calSum, maxSum)
return maxSum