数组题解——最大子数组和【LeetCode】(更新版)
基础解法参考,数组题解——最大子数组和【LeetCode】
动态规划方法:
一、算法思路
- 用
f
表示“当前以当前元素结尾的最大子数组和”。 - 每次
f = max(f, 0) + x
,表示如果当前累加和小于0就舍弃,从当前元素重新开始累加。 - 用
ans
记录遍历过程中出现的最大子数组和。
二、时间复杂度和空间复杂度
- 时间复杂度:O(n),只遍历一次数组。
- 空间复杂度:O(1),只用到常数个变量。
class Solution:def maxSubArray(self, nums: List[int]) -> int:ans = -inf # 注意答案可以是负数,不能初始化成 0f = 0for x in nums:f = max(f, 0) + xans = max(ans, f)return ans
举例
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
x | f = max(f,0)+x | ans更新结果 |
---|---|---|
-2 | 0 + -2 = -2 | -2 |
1 | 0 + 1 = 1 | 1 |
-3 | 1 + -3 = -2 | 1 |
4 | 0 + 4 = 4 | 4 |
-1 | 4 + -1 = 3 | 4 |
2 | 3 + 2 = 5 | 5 |
1 | 5 + 1 = 6 | 6 |
-5 | 6 + -5 = 1 | 6 |
4 | 1 + 4 = 5 | 6 |
最终返回6。