最大子树问题(The maximum-subarray problem)

该博客介绍了最大子树问题,即在包含正负数的数组中找到连续子数组,使其和最大。当数组全为非负数时问题简单,而存在负数时问题变得有趣。文中给出了该问题的C语言 Θ(nlgn) 时间复杂度解决方案。

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

最大子树问题(The maximum-subarray problem) Introduction to Algorithms Chapter4.1

通俗的说就是在一堆有正有负的数中找出连续的一组数字,使它们的和最大。

The maximum-subarray problem is interesting only when the array contains some negative numbers. If all the array entries were nonnegative, then the maximum-subarray problem would present no challenge, since the entire array would give the greatest sum.


这是最大子树问题 Θ(nlgn) 的C语言实现代码

#include<stdio.h>

typedef struct
{
	int maxLeft;
	int maxRight;
	int sum;
}Cross;

Cross find_max_crossing_subarray(int a[],int low,int mid,int high)
{   //为了返回多个值,用了结构体
	Cross cross;
	int leftSum,rightSum;
	int sum=0;
	cross.maxLeft=0;
	cross.maxRight=0;
	for(int i=mid;i>=0;i--)
	{
		sum+=a[i];
		if(sum>leftSum)
		{
			leftSum=sum;
			cross.maxLeft=i;
		}
	}
	sum=0;
	for(i=mid+1;i<=high;i++)
	{
		sum+=a[i];
		if(sum>rightSum)
		{
			rightSum=sum;
			cross.maxRight=i;
		}
	}
	cross.sum=leftSum+rightSum;
	return cross;
}

Cross find_max_subarray(int a[],int low,int high)
{
	Cross cross,crossLeft,crossRight;
	if(high==low)
	{
		cross.maxLeft=low;
		cross.maxRight=high;
		cross.sum=a[low];
		return cross;
	}
	else
	{
		int mid=(low+high)/2;
		crossLeft=find_max_subarray(a,low, mid);
		crossRight=find_max_subarray(a,mid+1, high);
		cross=find_max_crossing_subarray(a,low,mid,high);
		if(crossLeft.sum>=crossRight.sum&&crossLeft.sum>=cross.sum)
			return crossLeft;
		else if(crossRight.sum>=crossLeft.sum&&crossRight.sum>=cross.sum)
			return crossRight;
		else 
			return cross;
	}
}


void main()
{
	int a[10]={2,-5,8,-7,6,9,0,-3,1,-4};
	Cross cross;
	cross=find_max_subarray(a,0,9);
	printf("第%d~%d个数的和最大,为:%d",cross.maxLeft+1,cross.maxRight+1,cross.sum);
	printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值