上次写了个算法导论的实现方法,然后继续看练习题发现可以用更简单的方式去实现,利用线性的方式去实现O(n)复杂度的算法。思想是记录从左边记录自己当前处理过的最大子数组,然后进行连续记录,如果加和小于0,则置为0,继续进行加和求解!
具体代码如下:
int Find_MaxiMum_SubArray2(int *A,int low,int high,int& max_left,int& max_right,int& max_value)
{
max_left = low;
max_right= low;
max_value = 0;
int ThisSum=0;
int tmp_left=low;
for (int i = low; i < high+1; i++)
{
ThisSum += A[i];
if (ThisSum>max_value)
{
max_value = ThisSum;
max_right = i;
max_left = tmp_left;
}
else if(ThisSum<0)
{
ThisSum = 0;
tmp_left = i+1;
}
}
return 0;
}
发现代码比原来更短,且时间复杂度更好。