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

这篇博客探讨了如何解决求最大子序列的问题。首先介绍了暴力求解方法,但指出其时间复杂度较高,接着讲解了使用分治法进行优化,通过将数组分为两半并递归处理。最后,文章提到了一种分析法,通过维护当前子序列的和sum,动态判断是否继续添加下一个元素,从而找到最大和。
最低0.47元/天 解锁文章
1094

被折叠的 条评论
为什么被折叠?



