给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 1、转移方程 f(i) = max{ f(i-1) + ai , ai }
# f(i) 代表以第i个元素结尾的连续序列最大和 max f(i) 0<=f(i)<=n-1
# 其中f(i)可以有f(i-1) + ai 和 ai本身来决定
# pre = nums[0]
# max_sum = nums[0]
# n = len(nums)
# for i in range(1,n):
# pre = max( pre + nums[i] , nums[i]) # 比较当前元素与之前序列的大小 留下最大的
# max_sum = max(max_sum , pre) # 更新最大值
# return max_sum
# 2、分治算法
# 1) 需要维护什么信息
# 2) 如何去合并
class status: # 定义结构体
def __init__(self):
self.lsum = 0
self.rsum = 0
self.msum = 0
self.isum = 0
def getInfo(a,l,r): # 分治方法
if l == r: # 退出条件
tmp = status()
tmp.lsum = a[l]
tmp.rsum = a[l]
tmp.msum = a[l]
tmp.isum = a[l]
return tmp
m = (l + r) >> 1
lsub = getInfo(a,l,m)
rsub = getInfo(a,m+1,r)
return pushUp(lsub,rsub)
def pushUp(l,r): # 合并[l,r]的信息
isum = l.isum + r.isum
lsum = max(l.lsum,l.isum+r.lsum)
rsum = max(r.rsum,r.isum+l.rsum)
msum = max(l.msum,r.msum,l.rsum+r.lsum)
tmp = status()
tmp.lsum = lsum
tmp.rsum = rsum
tmp.msum = msum
tmp.isum = isum
return tmp
return getInfo(nums,0,len(nums)-1).msum