给定一个数组,查找这个数组的子数组的最大和
比如{-2,5,3,-6,4,-8,6}
输出最大和8
分析:假设已经找到一个子数组的最大和,这个子数组是从数组索引i到索引j。
可以用如下式子描述,cur_max = a[i , j]; 对于下一个数,也就是索引为j+1,这个最大和是否
将a[j+1]加入cur_max,需要考虑cur_max的值和a[j+1];
如果当前的cur_max小于0,说明a[j+1] > a[i, j] + a[j]; cur_max = a[j+1];说明此时最大值从索引j+1开始
如果当前的cur_max大于或者等于0,cur_max = cur_max + a[j+1]。
每一轮需要比较cur_max和记录的max值进行比较更新。
此算法的时间复杂度为O(N) 空间复杂度为O(1);
源码:
int MaxSum( const int* numbers, unsigned int N )
{
assert( numbers );
int max = numbers[0];
int cur_max = max;
for ( int i=1; i<N; i++ )
{
if( cur_max < 0 )
cur_max = 0;
cur_max += numbers[i];
if( cur_max > max )
max = cur_max;
}
return max;
}