求数组的最大和子串

该博客介绍了一种解决数组中寻找最大和子串的方法,通过使用两个游标i和j从前往后扫描数组,同时维护前缀和preSum和后缀和postSum。当preSum或postSum小于0时,更新它们并记录子串范围。循环直到i大于等于j,最终得到的最大子串范围即为所求。

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

求一个数组的最大和子串

思路:

(1)用两个游标i,j同时从前往后扫描,用preSum和postSum记录两个方向的前n向和;

(2)用两个固定的位置pos1,pos2记录对应子串的范围,即(pos1,pos2);

(3)若preSum<0,则重新把preSum置为0,pos1等于那个比较大的负数的位置;

(4)若postSum<0,则重新把postSum置为0,post2等于那个比较大的负数的位置;

(5)循环终止条件为i>=j,此时(pos1,pos2)即为和最大的子串。

int GetMaxSumSubArray(int a[], int length1)
{
	int i = 0;
	int pos1 = 0;
	int j = length1 - 1;
	int pos2 = length1 - 1;
	int preSum = 0;
	int postSum = 0;
	while (i < length1)
	{
	
		if (i >= j)
		{
			for (int i = 0; i <= pos1; ++i)
			{
				a[i] = 0;
			}
			for (int j = pos2; j < length1;++j)
			{
				a[j] = 0;
			}
			break;
		}
		preSum += a[i];
		postSum += a[j];
		if (preSum < 0)
		{
			preSum = 0;
			pos1 = i;
		}
		if (postSum < 0)
		{
			postSum = 0;
			pos2 = j;
		}
		++i; --j;
	}
	return 0;

}
/*
最优方法,时间复杂度O(n)
和最大的子序列的第一个元素肯定是正数
因为元素有正有负,因此子序列的最大和一定大于0
*/
int MaxSubSum3(int *arr,int len)
{
	int i;
	int MaxSum = 0;
	int CurSum = 0;
	for(i=0;i<len;i++)
	{
		CurSum += arr[i];
		if(CurSum > MaxSum)
			MaxSum = CurSum;
		//如果累加和出现小于0的情况,
		//则和最大的子序列肯定不可能包含前面的元素,
		//这时将累加和置0,从下个元素重新开始累加
		if(CurSum < 0)
			CurSum = 0;
	}
	return MaxSum;
}


没有考虑全部为负数的情况,输出结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值