在第一讲里面陈越老师解决这个问题使用的是暴力的方式
首先是O(n^3)的三重循环

而这个方法在i的每次循环体中,作为子列元素下标的k都要从i开始加到j,而j在每次循环中也是从i到n,会有很多部分被重复计算,所以有以下优化,算法复杂度降低到O(n^2)

这个算法去掉了最内层循环,对于相同左端位置的子列只在右端更新时进行max的判断
当然这个算法中还是有很多重复运算的部分,对于O(n^2)的问题我们可以优化为O(nlogn)的复杂度的算法
下面从暴力跨越到了分治法

这个问题的思想就是把问题一分为二,二分为四,最后再合并,比较得出左边最大的子序列和、右边最大的子序列和、和跨越中线的最大子序列和中的最大值,作为问题的解,这个手段是一直递归到一个元素的
问题的解决流程就是先将子列划分到(4)、(-3)、(5)、(-2)这种程度,就像图片中黄线标记出的,然后对于(4)这个子列的最大子列和就是4,(-3)是-3,跨越中线的子列为(4,-3),其和为1,所以这次得到的最大子列和为4。同理,求得(5)、(-2)这边的最大子列和为5。然后往上层走,(4,-3)的为4,(5,-2)的为5,跨越这个中线(就是中间的红线的)求法就是从中间向两边拓展(因为所求的就是跨越中线的),来求两边各自的最大子列和,就是顺序累加然后使用一个变量维护累加的最大值,每次的复杂度显然是O(n),所以拓展的结果左边是1右边是5,最后跨越中线的就是6了,合并的结果取4、5、6中的最大值6。后面的解法就类似了。
时间复杂度分析如下

嗯,最后还有一个最快的

之所以叫做在线处理是因为它是一个一个往前读的,用户每输入一个数值都可以给出当前子列和的最大值,而不用等待全部子列都录入之后才能求得。这里更新子列左端点的依据就是现有的子列和为负值,不能再使新加入成员之后的子列和更大了,于是就抛弃掉了。
最后是算法时间的比较
