1 蛮力法:
从第一个元素开始的子序列有A[0],A[0]-A[1],....A[0]-A[i],...A[0]-A[n-1]
从第i个元素开始的子序列有]..A[i,A[i]-A[i+1],...A[i]-A[n]
如此我们只需把每一种情况求出来进行比较即可得到结果
第i个元素都是是N-i次计算
共有N个元素 那么复杂度位 N-1+(N-2)+....1 = O(N^2)
2 分治法
把数组分成2段,分别求出这两段的最大子数组的和,那么最大的子序列只可能是左边最大的或者右边最大的,或者跨越中间的元素的一段(求这个需要遍历数组一遍)
由于N个元素二分成log2(N)次,每一次往下分解都需要遍历数组一次(每一次往下分解将遍历的子数组加起来就相当于遍历整个数组),也就是需要N*log2N次,因而复杂度位N*log2N
3 减治法
假如我们知道A[i+1]-A[n-1]的最大子数组和位Max[i+1],从A[i+1]开始的最大子序列位Start[i+1],那么我们接下来分析A[i]-A[n-1]对应的最大子数组和以及从A[i]开始的start[i]
我说包含A[i]之后A[i]-A[n-1]子序列最大的值为Max(A[i],A[i]+start[i+1],max[i+1]); 为什么呢?
(1) 假如最大子序列不包含A[i] 那么最大值是不是max[i+1]呢?
(2) 假如最大子序列包含A[i] ,那么最大值情况是不是A[i]或者A[i]+start[i+1]呢 你想假如start[i+1]是在m这个位置结束的,那么假如包含A[i]并且序列越过或者在m左边的序列(这里这个序列不仅仅包含A[i]),一定比A[i]+start[i+1]小,那么仅仅包含A[i]的情况则是start[i+1]小于0了
还有一个问题,我们如何求start[i]呢?
很简单,要么是A[i]要么是A[i]+start[i+1] ,道理与上面类似
这里我们只需要遍历一次数组既可以求出最大值 因而复杂度为O(N)
测试代码如下:
http://download.csdn.net/detail/learniting/4618388