【C语言】输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的 最大值。要求时间复杂度为O(n)。

在做这个题的时候,首先想到的是循环嵌套,以数组的每个元素为首元素,并依次计算和,并将和储存,最后求最大值。

int main()
{
	int arr[8] = { 1,-2,3,10,-4,7,2,-5 };
	int arr1[100] = { 0 };
	int count = 0;
	int i = 0, j = 0;
	for (i = 0; i < 8; i++)
	{
		arr1[count] = 0;
		count++;
		for (j = 0; j < 8 - i; j++)
		{
			arr1[count] = arr1[count-1] + arr[i + j];
			count++;
		}
	}
	for (i = 0; i < count-1; i++)
	{
		for (j = 0; j < count - i - 1; j++)
		{
			if (arr1[j] < arr1[j + 1])
			{
				int q = arr1[j + 1];
				arr1[j + 1] = arr1[j];
				arr1[j] = q;
			}
		}
	}
	printf("%d", arr1[0]);
	return 0;
}

这样遍历,虽然做对了,可是却不满足题目给出的时间复杂度要求。因此,只允许我们进行一次遍历,那该怎么做呢?

int main()
{
	int arr[8] = { 1,-2,3,10,-4,7,2,-5 };
	int i = 0;
	int sum = 0;//定义当前坐标下元素累加的和
	int max = 0;//定义当前子数列累加最大值
	for (i = 0; i < 8; i++)
	{
		if (sum + arr[i] < 0)
			sum = 0;/*如果上一次累加和加上当前元素结果为负值,那么它即使
			加上别的数也只会使其缩小,所以sum=0干脆扔掉这个拖油瓶,
			并且使累加从下一个元素重新开始*/
		else
			sum += arr[i];/*如果不为0,那么sum存储当前和并且累加,如果
			if语句执行,这条代码会跳过当前这个使sum变为负数的元素*/
		if (sum > max)
			max = sum;//判断sum与max的大小
	}
	printf("%d", max);
	return 0;
}

这样一来问题便迎刃而解。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值