p39最大子数组问题o(lgn)

/*
 * max.c
 *
 *  Created on: Feb 4, 2016
 *      Author: wing
 */
/*
 * test.c
 *
 *  Created on: 2016年1月21日
 *      Author: wing
 */
#include<stdio.h>
#include<stdlib.h>
int smax(int *num,int l,int r,int *maxi,int *maxj)
{
	int maxl=0,maxr=0,i,j,m=(l+r)/2,tmp;
	tmp=0;
	for (j=m;j<=r;j++)
		{
			tmp+=num[j];
			if (maxr<tmp)
			{
				maxr=tmp;
				*maxj=j;
			}
		}
	tmp=0;
	for (i=m;i>=l;i--)
		{
			tmp+=num[i];
			if (maxl<tmp)
			{
				maxl=tmp;
				*maxi=i;
			}
		}
	return maxl+maxr-num[m];
}
int max(int a,int b)
{
	return a>b?a:b;
}
int find(int *num,int l,int r)
{
	int *maxi,*maxj,maxl,maxr,maxm;
	if (l==r)
		return num[l];
	maxi=(int *)malloc(sizeof(int));
	maxj=(int *)malloc(sizeof(int));
	maxl=find(num,l,(l+r)/2);
	maxr=find(num,(l+r)/2+1,r);
	maxm=smax(num,l,r,maxi,maxj);
	return max(max(maxl,maxr),maxm);
}
int main(void)
{
	int *num,i,n;
	scanf("%d",&n);
	num=(int *)malloc(sizeof(int)*n);
	for (i=0;i<n;i++)
		scanf("%d",&num[i]);
	printf("%d",find(num,0,n-1));
	return 0;
}


不考虑输入数据的话复杂度是o(lgn)

该算法的思路是分治,最大的差要么在左边,要么在右边,要么是右边的最大值与左边的最小值之差,只是从递归下层要传到上层的东西多一些而已


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值