一,O(n)算法,解释见代码
二,分治算法
跟二分查找的思想相似,我们可以分情况讨论这个问题是不是符合二分查找的条件。
情况1.这个满足最大和的子数组全部在本数组的左半部或者右半部。例如:左半部A[i]……A[n/2-1]或者右半部A[n/2]……A[j]。这种情况下可以直接使用递归调用。
情况2.满足最大和的子数组跨过了本数组的中间点。例如:A[i]……A[n/2-1] A[n/2]……A[j]连续。则这种情况下只要在左半部寻找以A[n/2-1]结尾,在右半部寻找以A[n/2]开头的两个满足最大和的连续数组,并求和即可。由于这个已知起点,只需要一个游标即可,所以复杂度是2*O(n/2)=O(n)。
综合以上两种情况,满足分治算法递归式:T(n)=2T(n/2)+O(n)=O(n*logn)。
#include<stdio.h>
int Max(int a,int b)
{
return a>b?a:b;
}
//算法一O(n)
int ReturnMax(int a[],int n)
{
int b=0,max=a[0],i;
for(i=0;i<n;i++)
{
if(b>=0)b+=a[i];
else b=a[i];//当有和是负数时,则扔掉这一段
//加入都是负数返回