这道题的题目为:输入一个整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个连续子数组。求所有子数组的和最大值,要求时间复杂度为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;
}