特点:子列表不为空,一个列表中找到连续子列表的最大和,列表数字可负可正
解题思路
最大子列表有可能在左子列表、右子列表、左子列表和右子列表之间。我们需要找到子列表的最大值列表的和、右子列表的最大子列表之和、左子列表和右子列表之间的子列表最大和,在进行比较
"""
连续子列表的最大和解题思路: 一个列表 使用分治算法的时候 递归形式下 将列表分为两个子列表
【32, 43, 54, 12, 32, 31, 2, 4, 2】AA --> 32 43 54 12 (A), 32 31 2 4 2(B)
最大和 是从 (AA的和, A的和, B的和) 取出最大的一个和
# 现在需要做的是找到第三种可能,也就是左子列表与右子列表之间的子列表的最大和。设一个中点,遍历中点左边的值,跟踪记录已经遍历过的值的总和,取这些总和的最大值;同样的方法遍历中点右边的值。最后,左边的最大值加上右边的最大值加上中点值就是想要的值
"""
def sum_max(ali):
if ali == []: # 空列表直接返回 1位元素 直接返回1位元素
return
if len(ali) == 1:
return ali[0]
n = len(ali) // 2 # 设置中点
left = sum_max(ali[:n]) # 分治 中点左边部分 找到左边列表的最大和
right = sum_max(ali[n:]) # 分治 中点右边部分 找到右边列表的最大和
lms = 0