跳转至

连续子数组的最大和

"""
动态规划: 其基本思想是将待求解问题分解成若干个子问题,
先求解子问题,然后从这些子问题的解得到原问题的解
"""


def func(li):
    """
    问题: 
    对于一个长度为 n 的数组, 求连续子数组的最大和

    核心: 
    如果 li[i] 前面的所有数字(子数组)之和小于 li[i],
    那么前面的子数组放弃, 从当前数字 li[i] 重新开始求和

    思路: 
    利用动态规划算法, 将长度为 n 的数组, 拆解成两部分 li[0] 和 li[1:],
    再将 li[1:] 拆解成 li[1:][0] 和 li[1:][1:], 以此类推
    """

    # 1、首先, 姑且认为第一个数字是最大的, 比剩余所有元素的累积还要要大
    max_sum = li[0]
    # 2、其次, 定义一个临时变量, 记录真正的最大和
    tmp = 0

    # 3、然后, 遍历整个数组
    for i in li:

        # 4、接着, 用临时变量 tmp (初始值为0) + 当前数字后与当前的数字比大小
        # 就是说如果前面的一系列数字(子数组)之和都不如当前的数字大,
        # 则抛弃子数组保留(赋值给 tmp )当前数字, 否则反之
        tmp = max(tmp + i, i)

        # 5、最后, 判断一下我们认为的最大和(max_sum) 
        # 与真正的最大和(不断遍历累加并判断后被赋值的 tmp) 哪个大
        max_sum = max(max_sum, tmp)

    return max_sum


def main():
    li = [1, -2, 3, 10, -4, 7, 2, -5]
    print(func(li))

    li = [2]
    print(func(li))

    li = [-10]
    print(func(li))


if __name__ == '__main__':
    main()