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

本文介绍了一个使用C语言实现的寻找数组中最大子数组和的算法。该算法通过递归方式将问题分解为左右两部分,并计算跨越中间点的最大子数组和。最终返回三者中的最大值作为当前区间内的最大子数组和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值