53. 最大子序和

https://leetcode-cn.com/problems/maximum-subarray/

解法一:暴力

遍历所有长度的连续子段,but超时

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = -sys.maxsize
        for i in range(len(nums)):
            for j in range(i, -1, -1):
                res = max(res, sum(nums[j:i+1]))
        return res

解法二:dp

摘自《计算机算法设计与分析》王晓东 第3版

2020.3.29

2021.10.13 nums[0..i] 中的「最大的子数组和」为 dp[i]。

问题:能用 dp[i] 推出 dp[i+1] 吗?(与300. 最长上升子序列的问题类似)

实际上是不行的,因为子数组一定是连续的,按照我们当前 dp 数组定义,并不能保证 nums[0..i] 中的最大子数组与 nums[i+1] 是相邻的,也就没办法从 dp[i] 推导出 dp[i+1]。

改进:以 nums[i] 为结尾的「最大子数组和」为 dp[i]。

改进:状态压缩 由于迭代过程中只用到dp[i-1]和dp[i],用dp_0和dp_1代替节省空间

最后更新于