求子数组的最大和

来源:互联网 发布:小微企业会计核算软件 编辑:程序博客网 时间:2024/06/06 04:06
       输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

       注意由于有时间复杂度的要求,那么在整个算法中只能涉及一次循环操作。

       当时笔试的时候总共花了20分钟来完成了该算法,如果该算法有问题请给我留言。

//【 刘涛个人算法,欢迎挑刺。】

int GetMaxValue(int *data, int size)
{
int i = 0;
int max=0; //保存一次搜索中的最大值
int add=0; //保存着每一次的叠加值
if(data==NULL)
{
return 0;
}
max=data[0];
for(i=0;i<size;i++)
{
add += data[i]; //叠加当前的值后的结果
if(add > data[i]) //[说明这次的叠加后的值大于当前的值]
{
if(add >= max) //[有可能存在3,2,1,-2,1情况]
{
max = add;
}
}
else //[说明这次叠加后的值还没当前的值大]
{
add = data[i];
}
}
return max;
}

//
刘涛个人测试,欢迎挑刺
int main(void)
{
int a[] = {1,-2,3,10,-4,7,2,-5}; //18
int b[] = {-1,-2,-3,-10,-4,-7,-2,-5}; //-1
int c[] = {-10,5,-3,4,1,-2,-1};  //7
GetMaxValue(a,sizeof(a)/sizeof(int));
GetMaxValue(b,sizeof(b)/sizeof(int));
GetMaxValue(c,sizeof(c)/sizeof(int));
}


0 0