分治算法--连续子列表最大和

特点:子列表不为空,一个列表中找到连续子列表的最大和,列表数字可负可正

解题思路

最大子列表有可能在左子列表、右子列表、左子列表和右子列表之间。我们需要找到子列表的最大值列表的和、右子列表的最大子列表之和、左子列表和右子列表之间的子列表最大和,在进行比较

"""
连续子列表的最大和解题思路: 一个列表  使用分治算法的时候  递归形式下  将列表分为两个子列表
【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         # 已经遍历过的最大值
    rms = 0
    maxl = 0       # 总和的最大值
    maxr = 0
    # 找到左子列表和右子列表的最大值
    for i in range(n-1, -1, -1):
        lms += ali[i]
        maxl = max(lms, maxl)
        print(lms, maxl, '----------l')
    for i in range(n+1, len(ali), 1):
        rms += ali[i]
        maxr = max(rms, maxr)
        print(rms, maxr, '-----------r')
    print(left, maxl+ali[n]+maxr, right, ali[n])
    # 返回三个可能的最大值
    return max(left, maxl+ali[n]+maxr, right)


maxSum = sum_max([3, -2, -2, -1, 6, 4, -4, 5, 1])    # 6
print(maxSum)

 

你可能感兴趣的:(算法,分治算法,最大子列表之和)