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代替节省空间
最后更新于