【LeetCode】Day14

53.最大子序和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

def maxSubArray(nums):
    """
    动态规划:分解成小问题,先解决小问题,当小问题解决完,即大问题也就解决了(先解后合发展一组解)
    返回数组中具有最大和的连续子数组的和
    动态规划算法的核心就是记住已经解决过的子问题的解
    :param nums: List[int]
    :return: int
    """
    for i in range(1, len(nums)):
        #理解:假设我是一个数字,我需要联合前面一个数变强,如果前面一个是负数,那么对我没有加强作用,我还不如自己一个人
        #如果是一个正数,那么对我有增益效果,就加上前一个数(前一个数也是这样来的,这样就满足了连续子数组最大和,
        # 相当于前面一个人加强自己的过程已经完成,这就是一个小过程)变成全新的我,最后返回队伍中的最强大的(大过程,最终结果)
        nums[i] = nums[i] + max(nums[i - 1], 0)
    return max(nums)

print(maxSubArray([5, 4, -1, 7, 8]))

官方解答:leetcode官方

复习动态规划CSDN动态规划

动态规划(自底向上,先解后合,发展一组解)算法的核心就是记住已经解决过的子问题的解

①最优子结构

用动态规划求解最优化问题的第一步就是刻画最优解的结构,如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。因此,某个问题是否适合应用动态规划算法,它是否具有最优子结构性质是一个很好的线索。使用动态规划算法时,用子问题的最优解来构造原问题的最优解。因此必须考查最优解中用到的所有子问题。

②重叠子问题

在斐波拉契数列和钢条切割结构图中,可以看到大量的重叠子问题,比如说在求fib(6)的时候,fib(2)被调用了5次,在求cut(4)的时候cut(0)被调用了4次。如果使用递归算法的时候会反复的求解相同的子问题,不停的调用函数,而不是生成新的子问题。如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping subproblems)性质。在动态规划算法中使用数组来保存子问题的解,这样子问题多次求解的时候可以直接查表不用调用函数递归。

上一篇:day14 Linux特殊权限介绍


下一篇:Java 学习 day14: 匿名内部类,单例模式(饿汉,懒汉),工厂模式