求最大子序列

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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],舍去前面的值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值