1.暴力求解,时间复杂度为N^3
int MaxSubArray(int * A , int n){
int maxSum = a[0];
int currSum;
for(int i = 0 ; i < n ; i ++)
{
for(int j = i ; j<n ;j++)
{
currSum = 0;
for(int k = i ;k<=j;k++){
currSum +=A[k];
}
if(currSum > maxSum)
maxSum = currSum ;
}
}
return maxSum;
}
2.分治法
将数组从中间分开,那么最大子数组要么完全再左半边数组,要么完全在右半边数组,要么跨立在分界点上。完全在左数组、右数组递归解决。跨立在分界点上:实际上是左数组的最大后缀和右数组的最大前缀的和,因此,从分界点向前扫,向后扫即可。
double MaxAddSub(double *a,int from , int to){
if(to == from)
return a[from];
int middle = (from + to)/2;
double m1 = MaxAddSub(a,from,middle);
double m2 = MaxAddSub(a,middle+1,to);
int i,left = a[middle],now = a[middle];
for( i = middle -1;i>=from;--i)
{
now += a[i];
left = max (now , left);
}
int right = a[middle + 1];
now = a[middle + 1];
for(i=middle+2;i<=to;++i){
{
now += a[i];
right = max(now , right)
}
double m3 = left + right;
return max(m1.m2,m3);
}
3. 分析法(逻辑推理的算法应用)
只需要让sum为a[0]
如果sum大于0 ,就取下一位,如果sum小于0,就将sum=a[i],舍去前面的值