题目描述
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合动态规划 · Kadane。
1. 起点 · cur=best=-2:cur = 以当前元素结尾的最大子数组和。每步 cur = max(x, cur+x):从 x 重开 或 接前面。best 记全程最大。起点 -2:cur=best=-2。
2. 关键帧 · 看到 1,重开更优:关键帧:到 1,接前面 -2+1=-1 < 单独 1 → 丢前面、从 1 重开,cur=1,best=1。
3. 看到 -3,接上不亏:到 -3:cur+x=1−3=-2 > 单独 -3 → 接上,cur=-2;best 仍 1。
4. 看到 4,重开:到 4:前面 cur=-2 拖后腿(-2+4=2 < 4)→ 重开,cur=4,best=4。
5. 看到 -1,接上 cur=3:到 -1:4−1=3 > -1 → 接上,cur=3;best 仍 4。
6. 看到 2,接上 cur=5:到 2:3+2=5 → 接上,cur=5,best 更新到 5。
7. 关键帧 · 看到 1,best=6:关键帧:到 1,5+1=6 → cur=6,best=6 = 子数组 [4,-1,2,1] 的和。
8. 看到 -5,cur 回落 best 守住:到 -5:6−5=1,cur 回落到 1;但 best 守住 6 不变。
9. 答案 best=6:到 4:cur=max(4,1+4)=5,best 仍 6。答案 best=6,最大子数组 [4,-1,2,1]。
把这句话记住,下次遇到同类题,就能更快选出方向。
迁移阶梯:把这题练到能复述后,再去同类题里迁移:先复用状态定义,再调整边界条件。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def maxSubArray(self, nums): cur = best = nums[0] for x in nums[1:]: cur = max(x, cur + x) best = max(best, cur) return best复杂度
- 时间复杂度:O(n),每个核心状态按算法要求处理固定次数
- 空间复杂度:O(1),只保存必要的辅助结构或递归栈
可套用的代码模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
# 动态规划 · Kadane 通用检查表# 1. 定义状态/指针/容器# 2. 每轮只做一个清晰动作# 3. 更新答案并处理边界易错点
面试追问把动画讲成自己的话
追问Kadane 核心一句话?
追问全是负数怎么办?
追问和「乘积最大子数组」区别?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
跳跃游戏
LeetCode 55 · 中等 · 沿着 贪心 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题