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);