剑指offer-42:连续子数组的最大和

本文介绍了一种求解数组中连续子数组最大和的高效算法,时间复杂度为O(n)。通过遍历数组,利用CurSum记录当前子数组和,CurGreatSum更新最大和,实现了快速求解。

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

这道题的题目为:输入一个整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个连续子数组。求所有子数组的和最大值,要求时间复杂度为O(n)。

解题思路为:

(1)定义一个整形的CurGreatSum来标记子数组的最大和,然后用一个整形的CurSum来存储当前的和。

(2)从头遍历整个数组number,每遍历一个元素number[i],首先判断CurSum <= 0是否成立,若成立直接将CurSum中保存的值舍去,将number[i]赋值给CurSum。否则将CurSum与number[i]相加的结果赋值给CurSum。然后判断呢CurSum>CurGreatSum是否成立,成立则通过CurGreatSum = CurSum更新CurGreatSum中的值。

(3)重复步骤(2),直到整个number数组遍历完毕,返回CurGreatSum即可,此算法时间复杂度为O(n)。其中定义全局变量Input来标记输入是否有效。

代码如下:

#include<stdio.h>
#include<stdbool.h>
bool Input = false;
int  GreatSum(int *number, int length)
{
	if ((number == NULL) || (length <= 0))
	{
		Input = true;
		return 0;
	}
	Input = false;
	int CurSum = 0;
	int CurGreatSum = 0x80000000;
	for (int i = 0; i < length; ++i)
	{
		if (CurSum <= 0)
			CurSum = number[i];
		else
			CurSum += number[i];
		if (CurSum>CurGreatSum)
		{
			CurGreatSum = CurSum;
		}
	}
	return  CurGreatSum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值