#include<stdio.h>
#include<stdlib.h>
bool maxSubarray(int data[], int size,int &max)
{
if (size<=0)
{
printf("error array size\n");
return false;
}
int sum = 0, maxElement=-(1<<31);
max=0;
for(int i=0;i<size;i++)
{
if(data[i]>maxElement)
maxElement=data[i];
sum +=data[i];
if(sum>max)
{
max=sum;
}
else if(sum<0)
{
sum=0;
}
}
if(max==0)//all negative elements
max=maxElement;
return true;
}
int main()
{
int data[]={1, -2, 3, 10, -4, 7, 2, -5};
int max;
if( maxSubarray(data,8,max))
printf("%d\n",max);
int data2[]={-1, -2, -3, -10, -4, -7, -2, -5};
if( maxSubarray(data2,8,max) )
printf("%d\n",max);
getchar();
return 0;
}
这个看代码挺简单的,不过自己想的时候又把简单问题复杂化了,自己又递归又循环的最后还是没解决出来,接受不了,因为我觉的在递加的过程会出现数字小于零则保留原来最大数,数字不小于零但小于原来最大值,所以递归进去看看会怎样,数字不小于零而直接大于原来最大值,则直接修改原值。
不过看了源代码才醒悟啊。。。。。。。。。我笨死了
直接保留可能的最大值,再用另一个变量从头加到尾部,每次与最大值比较,如果大了,则修改,如果没大,则不变