连续子数组的最大和

这道题的题目为:输入一个整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个连续子数组。求所有子数组的和最大值,要求时间复杂度为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;
}
上一篇:oracle中的聚合函数count、max、min、sum、avg以及NVL函数的用法


下一篇:NVL()