2021后端笔试准备 17(动态规划:Kadane's algorithm)

算法描述:

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作为 后续的加和的数字。

图2

我们已经记录了一系列的加和值,这时候我们需要一个变量来记录最大值是哪一个,所以我们需要用到图三的公式。

用最大子集和当前加和当前加和进行比较,记录当前加和最大子集加和的情况是什么,如图二所示中maxSofar的情况。

max(3, 8) = 8, max(8, -1) = 8,以此类推,直到输入数组结束。

图4

代码部分

时间复杂度和空间复杂度分析:

时间复杂度是O(n),因为我们只需要遍历一次列表,每次都是记录一下当前的值,做比较这种比较的操作的时间复杂度是O(1),所以总的来说时间复杂度是O(n)

空间复杂度是O(1),因为每一次我们都只记录了两个变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容