算法描述:
Kadane's algorithm 是动态规划里面的一个经典的算法,作用是用来求 ‘最大的子序列和' 的问题。
举个栗子,给一个输入 [ 3, 5, - 9, 1, 3, -2, 3, 4, 7, 2, -9, 6, 3, 1, -5, 4],我们需要求这个数组中子集组成的最大的和是多少 [ 3, 5, - 9,| 1, 3, -2, 3, 4, 7, 2, -9, 6, 3, 1,| -5, 4] 是竖杠中间的部分,结果是 19。
Kadane’s 算法来解决这个问题的思路:
这是kadane’s 的两个公式,第一个公式描述的不是特别准确。(且听我接下来怎描述)
首先我们来看看Kadane的思路,当前数字之前的加和 + 当前数字 和 当前数字 取最大。
套用到图二中我们就可以看到 一开始的加和是 3,所以蓝色字体是3,到了第二个数字 3 + 5 = 8, max( 8, 5 )= 8,所以蓝色字体上面写的是8。
-9 也是同理。这时候我们看 数字1,数字1前面的加和是 -9 + 8 = -1,max( -1 , 1 ) = 1,所以我们选择1作为 后续的加和的数字。
我们已经记录了一系列的加和值,这时候我们需要一个变量来记录最大值是哪一个,所以我们需要用到图三的公式。
用最大子集和当前加和当前加和进行比较,记录当前加和最大子集加和的情况是什么,如图二所示中maxSofar的情况。
max(3, 8) = 8, max(8, -1) = 8,以此类推,直到输入数组结束。
代码部分
时间复杂度和空间复杂度分析:
时间复杂度是O(n),因为我们只需要遍历一次列表,每次都是记录一下当前的值,做比较这种比较的操作的时间复杂度是O(1),所以总的来说时间复杂度是O(n)
空间复杂度是O(1),因为每一次我们都只记录了两个变量。