数据结构与算法——寻找最大子列算法

一、介绍:

在这里插入图片描述

二、代码实现

#include<iostream>
using namespace std;

int MaxSequenceSum1(int N,int arr[])
{
    int MaxSum,ThisSum;
    MaxSum=0;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            ThisSum=0;
           for(int k=i;k<=j;k++)
           {
               ThisSum += arr[k];
           }
           if(ThisSum>MaxSum)
           {
               MaxSum=ThisSum;
           }
        }
    }
    return MaxSum;
}






int MaxSequenceSum2(int N,int arr[])
{
    int MaxSum,ThisSum;
    MaxSum=0;
    for(int i=0;i<N;i++)//i是子列左端位置
    {
        ThisSum=0;
        for(int j=i;j<N;j++)//j子列有段位置
        {
            ThisSum += arr[j];//对于同一起点的子列,只要在之前求和的基础上加一项即可
            if(ThisSum>MaxSum)
            {
                MaxSum=ThisSum;
            }
        }
    }
    return MaxSum;
}

int MaxSequenceSum3(int N,int arr[])
{
    int MaxSum,ThisSum;
    MaxSum=0;
    ThisSum=0;
    for(int i=0;i<N;i++)//向右累加
    {
        ThisSum += arr[i];
        if(ThisSum>0) MaxSum=ThisSum;//发现更大的和则更新最大值
        else ThisSum=0;//如果当前和<0,则不可能使后面部分的和增大,MaxSum抛弃归0
    }
    return MaxSum;
}

int main()
{
    int arr[9] = {0,-1,3,-4,7,5,-10,9,10};
    cout << MaxSequenceSum1(9,arr)<<endl;
    cout << MaxSequenceSum2(9,arr)<<endl;
    cout << MaxSequenceSum3(9,arr)<<endl;
}

结果:在这里插入图片描述
均为21正确结果
以上3个算法都可以,但时间复杂度不同,分别是O(N^3)
O(N^2),O(N),最后一种是在线式学习,思想方法比较重要,还有一种分而治之的思想方法。
附法三的图:在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值