最大子数组和要求从数组里找一段连续子数组,让它的和最大。经典例子里 [4, -1, 2, 1] 的和是 6。
Kadane 算法把问题压成一个一维 DP:
dp[i]= 必须以 a[i] 结尾的最大子数组和
对每个位置只有两个选择:
- 从
a[i]重新开始 - 接上前一段:
dp[i - 1] + a[i]
所以转移是:
dp[i] = max(a[i], dp[i - 1] + a[i])
同时维护全局最大的 best,就能在线性时间得到答案。
复杂度
- 时间:O(n)
- 空间:O(n)(动画保留了 dp 表;实际代码可压到 O(1))
在动画里看什么
- a 行是原数组,dp 行是“以当前位置结尾”的最好结果
- 深蓝是当前处理的位置
- 暖红是目前找到的全局最优连续区间
best显示当前最大和以及对应的左右边界