最好想的一种方法
穷举所有可能
int maxSubSum1(int a[],int size )
{
int maxSum = 0;
for ( int i = 0; i < size; i++ )
for ( int j = 1; j < size; j++ )
{
int thisSum = 0;
for ( int k = i; k <= j; k++ )
thisSum += a[k];
if ( thisSum > maxSum )
maxSum = thisSum;
}
return maxSum;
}
同样是穷举,但是对算法进行了优化
int max_sub(int a[],int size)
{
int i,j,v;
int max=a[0];
for(i=0;i<size;i++)
{
v=0;
for(j=i;j<size;j++)
{
v=v+a[j]; //Sum(i, j+1) = Sum(i, j) + A[j+1]
if(v>max) max=v;
}
}
return max;
}
分而治之
如果时间复杂度不能达到O(n),这是最优方法
/**
* Recursive maximum contiguous subsequence sum algorithm.
* Finds maximum sum in subarray spanning a[left..right].
* Does not attempt to maintain actual best sequence.
*/
int maxSumRec( const vector<int> & a, int left, int right )
{
if( left == right ) // Base case
if( a[ left ] > 0 )
return a[ left ];
else
return 0;
int center = ( left + right ) / 2;
int maxLeftSum = maxSumRec( a, left, center );
int maxRightSum = maxSumRec( a, center + 1, right );
int maxLeftBorderSum = 0, leftBorderSum = 0;
for( int i = center; i >= left; i-- )
{
leftBorderSum += a[ i ];
if( leftBorderSum > maxLeftBorderSum )
maxLeftBorderSum = leftBorderSum;
}
int maxRightBorderSum = 0, rightBorderSum = 0;
for( int j = center + 1; j <= right; j++ )
{
rightBorderSum += a[ j ];
if( rightBorderSum > maxRightBorderSum )
maxRightBorderSum = rightBorderSum;
}
return max3( maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum );
}
/**
* Driver for divide-and-conquer maximum contiguous
* subsequence sum algorithm.
*/
int maxSubSum3( const vector<int> & a )
{
return maxSumRec( a, 0, a.size( ) - 1 );
}
最完美的算法,起时间复杂度达到了o(n)
int max_sub2(int a[], int size)
{
int i,max=0,temp_sum=0;
for(i=0;i<size;i++)
{
temp_sum+=a[i];
if(temp_sum>max)
max=temp_sum;
else if(temp_sum<0)
temp_sum=0;
}
return max;
}