求一串数的最大子段和是一个经典问题,解决这个问题存在O(N^3),O(N^2),O(NlogN),O(N)算法。

把O(N)的算法记录如下:

  1. int maxSubSum(const vector<int>&a) 
  2.     int maxsum=0; 
  3.     int thissum=0; 
  4.     for(unsigned int j=0;j<a.size();j++) 
  5.     { 
  6.         thissum+=a[j]; 
  7.         if (thissum>maxsum) 
  8.         { 
  9.             maxsum=thissum; 
  10.         }else if (thissum<0) 
  11.         { 
  12.             thissum=0; 
  13.         } 
  14.     } 
  15.     return maxsum; 
这是解决此问题的完美算法。 其中思想也极为简单,即遇到数先加,如果当前和大于之前的最大值,就修改最大值,如果加上之后当前值小于了0,那么当前值为0。