求子数组的最大和

来源:互联网 发布:淘宝清理图片空间 编辑:程序博客网 时间:2024/06/06 04:43

#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;
}

 

 

这个看代码挺简单的,不过自己想的时候又把简单问题复杂化了,自己又递归又循环的最后还是没解决出来,接受不了,因为我觉的在递加的过程会出现数字小于零则保留原来最大数,数字不小于零但小于原来最大值,所以递归进去看看会怎样,数字不小于零而直接大于原来最大值,则直接修改原值。

 

 

不过看了源代码才醒悟啊。。。。。。。。。我笨死了

直接保留可能的最大值,再用另一个变量从头加到尾部,每次与最大值比较,如果大了,则修改,如果没大,则不变

 

 

原创粉丝点击