找出数组中连续的x个数,使其和最大(《编程珠玑》第八章)

其中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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值