Kadane算法:扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大和(正数和)。该子数列由两部分组成:以前一个位置为结束点的最大子数列、该位置的数值。因为该算法用到了“最佳子结构”(以每个位置为终点的最大子数列都是基于其前一位置的最大子数列计算得出)。
什么是Kadane算法
const arr = [5, 1, -9, 8, 3, 5, 7];
以arr数组为例子,那么:
i = 0 => 子数列最大和是5
i = 1 => 子序列最大和是Math.max(1, 1 + 5, 6) => 6 // [5, 1] [1] [5]
i = 2 => 子序列最大和是Math.max(5, 1, -9, 6, -4, -8, -4) => 6 // [5] [1] [-9] [5, 1] [5, -9] [1, -9] [5, 1, -9]
...
所以以该点数值为结束点的子数列的最大和:
max(i) = Math.max(max(i - 1) + arr[i], arr[i])
但是这样空间的复杂度是O(n),Kadane算法可以将空间复杂度降为O(1):
currentSubArr{0, i} = math.max(arr[i], currentSubArr{0, i-1} + arr[i])
currentMaxValue = Math.max(currentMaxValue, currentSubArr{0, i})
应用场景
- 求子数列的最大和
- 求差值(可以转换成求子数列的最大和)