求数组的子序列的和最大值,复杂度 nlog(n)

#include<stdio.h>
#include<stdlib.h>
int maxtmp(int, int, int );
int max(int a[], int lower, int hight)
{
if(lower == hight){
return a[lower];
}


int mid = (hight - lower)/2+lower;
int lmax= max(a, lower, mid);
int hmax= max(a, mid+1, hight);

int lsum=a[mid], temlsum= a[mid];
int i =mid-1;
for(;i>=lower; i--){

temlsum += a[i];
if( temlsum > lsum){ lsum = temlsum;}
}
int hsum=a[mid+1],temhsum= a[mid+1];
i = mid+2;
for(; i < hight; i++){


temhsum += a[i];
if( hsum < temhsum){ hsum = temhsum;}
}


return maxtmp(hsum+lsum,lmax,hmax);


}


int maxtmp(int max, int lmax , int hmax){


if(max > lmax  && max > hmax){ return max;}
if( lmax > max  &&  lmax > hmax ){ return lmax;}
return hmax;


}
int main(){


int ar[] = {2,3,-4,-5,1,2,4};
int size = (sizeof(ar)/ sizeof(int) -1);
int a = max(ar, 0 ,size);
printf("a is:%d\n",a);
return 1;


}

转载于:https://my.oschina.net/u/1388024/blog/173851

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值