待补充:
分治法
0721 前缀和On
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if nums == []:
return 0
pre = []#前缀和list 先填一个0
minpre = None#minpre[i]的含义是 [:i-1]中pre的最小值
maxres = None
for i,val in enumerate(nums):
#print(i,val,minpre,maxres,pre)
if pre == []:
pre.append(val)
minpre = min(0,val)
maxres = val
else:
this_pre = val + pre[-1]
pre.append(this_pre)
maxres = max(maxres,this_pre-minpre)
minpre = min(minpre,this_pre)
return maxres
我实现的方法 复杂度为O(n)的动态规划算法
其中,值得注意的是,
子问题f(i)的定义为以第i个数字(a[i])为结尾的最大和连续子数组的和
由于这个数组一定与a[i-1]连续,则也一定与以a[i-1]为结尾的最大和连续子数组相邻
因此 状态转移方程满足
f(i) = f(i-1) + a[i] if f(i-1) > 0 else a[i],i>=1
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if nums == []:
return 0
length = len(nums)
if length == 1:
return nums[0]
#本解法中,动态规划的状态转移方程f(i)
#代表以a(i)为结尾的最大和连续子数组
res = nums[0]
maxa = res
for i in range(length-1):
tempindex = i + 1#nums[tempindex]代表新考察的数字
if res >= 0:
res += nums[tempindex]
elif res < 0:
res = nums[tempindex]
if res > maxa:
maxa = res
return maxa