其中1的复杂度为O(n^3),2a和2b的复杂度为O(n^2),3的复杂度为O(nlogn),最后一个的复杂度是O(1).
#include<iostream>
usingnamespace std;
int maxSeriesVector1(intA[],int n)
{
intmax=0,currSum=0;
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
currSum=0;
for(intk=i;k<=j;k++)
currSum+=A[k];
if(max<currSum)
max=currSum;
}
}
returnmax;
}
int maxSeriesVector2a(intA[],int n)
{
intmax=0,currSum=0;
for(int i=0;i<n;i++)
{
currSum=0;
for(int j=i;j<n;j++)
{
currSum+=A[j];
if(max<currSum)
max=currSum;
}
}
returnmax;
}
int maxSeriesVector2b(intA[],int n)
{
int*initTable=newint[n+1];
initTable[0]=initTable[n]=0;
for(int i=0;i<n;i++)//这里的赋值和书《编程珠玑》上的正好相反
initTable[0]+=A[i];
for(int i=1;i<n;i++)
initTable[i]=initTable[i-1]-A[i-1];
intmax=0,currSum=0;
for(int i=0;i<n;i++)
{
currSum=0;
for(int j=i;j<n;j++)
{
currSum=initTable[i]-initTable[j+1];;
if(max<currSum)
max=currSum;
}
}
returnmax;
}
int maxSeriesVector3(intA[],int n)
{
if(n<1)
return0;
if(n==1)
returnmax(0,A[0]);
intmid=n>>1;
intleft=mid-1,right=mid;
intmaxMid=A[left]+A[right],maxValue=maxMid;
--left;++right;
while(left>=0|| right<n)
{
intvLeft=left>=0?A[left]:INT_MIN,vRight=right<n?A[right]:INT_MIN;
if(vLeft<vRight)
{
maxMid+=vRight;
right++;
}
else
{
maxMid+=vLeft;
left--;
}
if(maxValue<maxMid)
maxValue=maxMid;
}
return maxValue<maxSeriesVector3(A,mid)?max(maxSeriesVector3(A,mid),maxSeriesVector3(A+mid,n-mid)):max(maxValue,maxSeriesVector3(A+mid,n-mid));
}
int maxSeriesVector(intA[],int n)
{
intmaxSum=0,result=0;
for(int i=0;i<n;i++)
{
maxSum=max(maxSum+A[i],0);
if(maxSum>result)
result=maxSum;
}
return result;
}
int main()
{
intA[]={31,-41,59,26,-53,58,97,-93,-23,84};
cout<<maxSeriesVector(A,10)<<endl;
system("pause");
return 0;
}
参考:《编程珠玑》第八章
课后习题9:
对于最后一个O(n)的算法的代码如下:其他的只需要修改max=A[0]即可。
int maxSeriesVector(intA[],int n)
{
intmaxSum=0,result=A[0];
for(int i=0;i<n;i++)
{
maxSum=maxSum+A[i];
if(maxSum>result)
result=maxSum;
if(maxSum<0)
maxSum=0;
}
returnresult;
}