Leetcode-53.最大子序和
1.题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大为6。
2.解题算法
2.1 解题思路
(1)确定切分的终止条件
直到所有的子问题都是长度为 1 的数组,停止切分。
(2)准备数据,将大问题切分为小问题
递归地将原数组二分为左区间与右区间,直到最终的数组只剩下一个元素,将其返回
(3)处理子问题得到子结果,并合并
将数组切分为左右区间
对与左区间:从右到左计算左边的最大子序和
对与右区间:从左到右计算右边的最大子序和
由于左右区间计算累加和的方向不一致,因此,左右区间直接合并相加之后就是整个区间的和
最终返回左区间的元素、右区间的元素、以及整个区间(相对子问题)和的最大值
难点:
切分的终止条件容易确认,切分完成后对问题的处理以及结果的合成是难点
2.2 代码实现
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n=len(nums)
if n==0:
return None
if n==1:
return nums[0]
left=self.maxSubArray(nums[:n//2])
right=self.maxSubArray(nums[n//2:])
max_l=nums[n//2-1]
tmp=0
for i in range(n//2-1,-1,-1):
tmp=tmp+nums[i]
max_l=max(tmp,max_l)
max_r=nums[n//2]
tmp=0
for i in range(n//2,n):
tmp=tmp+nums[i]
max_r=max(tmp,max_r)
max_f=max(max_l+max_r,left,right)
return max_f
2.3 注意事项
(1)括号内用逗号
for i in range(n//2,n):
(2)不能直接return nums
return nums[0]
(3)range中的内容
for i in range(n//2-1,-1,-1):
range(start, stop[, step])
参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
(4)def 中最后的return要缩进
return max_f