如果子序列都是正数,那么该子序列一定是最大和得子序列的一部分。如果下一个数为负数,那么需要判断该负数和当前子序列的和是否未正。如果是负数,那么我们可以认为包含这个负数的子序列一定不是最大子序列。但是如果为正数,我们还需要继续判断后续节点是否可以使得最大和增加。例如1,2,-2,4显然1,2,-2,4为最大子序列。但是如果1,2,-2,1那么最大子序列应该为1,2.。那么用该方法判断可以在O(n)的时间复杂度找出最大和得子序列。
void getMaxSumSubArray(int* list, int length)
{
if( NULL == list || length < 1)
{
return;
}
int* result = new int[length];
int currentSum = 0;
int currentpos = 0;
int MaxSum = 0;
int Maxend = 0;
for(int i = 0; i < length ; ++i)
{
// init and find the new begining of the max sum array
if(0 == currentpos && list[i] > 0)
{
result[currentpos] = list[i];
currentSum = result[currentpos];
++currentpos;
}
else if(list[i] + currentSum > 0)
{
result[currentpos] = list[i];
currentSum = currentSum + list[i];
++currentpos;
}
else
{
currentSum = 0;
currentpos = 0;
}
if(currentSum > MaxSum)
{
MaxSum = currentSum;
Maxend = currentpos;
}
}
for(int i = 0; i < Maxend ; ++i)
{
printf("%d ", result[i]);
}
delete [] result;
}