数据结构 —— 求最大子列和

25 篇文章 4 订阅
1 篇文章 0 订阅

原理:

陈越姥姥已经讲得很好了:传送门,我只做记录方便回顾。

 

四种算法:

1. 暴力,算法复杂度:O(n^3)。

2. 暴力,算法复杂度:O(n^2)。

3. 分治法(递归),算法复杂度:O(nlogn)。

4. 及时处理,算法复杂度:O(n)。

 

代码:

#include<stdio.h>

int a[100000];

int whoIsMax(int i, int j, int k)
{
    if(i>=j && i>=k)
    {
        return i;
    }
    if(j>=i && j>=k)
    {
        return j;
    }
    if(k>=i && k>=j)
    {
        return k;
    }
}


int fenzhi(int start, int end)
{
    int ZuoMax = 0;
    int YouMax = 0;
    int ZhongMax = 0;
    int ZuoSum = 0;
    int YouSum = 0;

    //出口
    if(start == end)
    {
        if(a[start]>0)
        {
            return a[start];
        }
        else
        {
            return 0;
        }
    }

    int mid = (start + end) / 2;

    ZuoMax = fenzhi(start, mid);
    YouMax = fenzhi(mid+1, end);


    int kua_zuo_max = 0, kua_you_max = 0;
    int kua_zuo_sum = 0, kua_you_sum = 0;

    for(int i = mid; i>=start; i--)
    {
        kua_zuo_sum += a[i];
        if(kua_zuo_sum > kua_zuo_max)
        {
            kua_zuo_max = kua_zuo_sum;
        }
    }
    for(int i = mid+1; i<=end; i++)
    {
        kua_you_sum += a[i];
        if(kua_you_sum > kua_you_max)
        {
            kua_you_max = kua_you_sum;
        }
    }
    ZhongMax = kua_you_max + kua_zuo_max;
    return whoIsMax(ZuoMax, YouMax, ZhongMax);
}


int main(void)
{
    int N;

    scanf("%d", &N);

    // for(int i = 0; i<N; i++)
    // {
    //     scanf("%d", &a[i]);
    // }

    //int ThisSum = 0;
    int Max = 0;

    //Algorithm 1
    // for(int i = 0; i<N; i++)
    // {
    //     for(int j = i; j<N; j++)
    //     {
    //         ThisSum = 0;
    //         for(int k = i; k<=j; k++)
    //         {
    //             ThisSum += a[k];
    //         }
    //         if(ThisSum > Max)
    //         {
    //             Max = ThisSum;
    //         }
    //     }
    // }


    //Algorithm 2
    // for(int i = 0; i<N; i++)
    // {
    //     ThisSum = 0;
    //     for(int j = i; j<N; j++)
    //     {
    //         ThisSum += a[j];
    //         if(Max < ThisSum)
    //         {
    //             Max = ThisSum;
    //         }
    //     }
    // }



    //Algorithm 3
    //Max = fenzhi(0, N-1);


    //Algorithm 4
    int ThisSum = 0;
    for(int i = 0; i<N; i++)
    {
        int temp;
        scanf("%d", &temp);
        ThisSum += temp;
        if(ThisSum<0)
        {
            ThisSum = 0;
        }
        if(Max < ThisSum)
        {
            Max = ThisSum;
        }
    }

    printf("%d", Max);

    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值