最大连续子序列和

题目

求数组中最大的连续序列的和,如果数组元素全为负数返回0

做法及代码

蛮力法

遍历 以i为起点,长度为1  -  n-i+1  ,i =0 ... n-1 ,时间复杂度O(n^2)

int maxSeq(int *arr,int num,int&start,int&end){
        int ret=0;
        start=-1;
        end=-1;
        int s=0;
        for(int i=0;i<num;++i){
                int maxLen=num-i;
                int temp=0;
                for(int len=1;len<=maxLen;++len){
                        temp+=arr[i+len-1];
                        if(temp>ret){
                                ret=temp;
                                start=i;
                                end=i+len-1;
                        }
                }
        }
        return ret;
}

动态规划法

动态规划,依次加入数组中元素进行统计,时间复杂度O(n)

//dp
int maxSeqDP(int *arr,int num,int&start,int&end){
        int ret=0;
        int temp=0;
        start=-1;
        end=-1;
        int s=0;
        for(int i=0;i<num;++i){
                temp+=arr[i];
                if(temp<0){
                        temp=0;
                        s=i+1;
                }else if(temp>ret){
                        ret=temp;
                        start=s;
                        end=i;
                }
        }
        return ret;
}

测试代码

#include <iostream>
#include <cstdlib>
int main(int argc,char** argv){
        int num=10;
        if(argc>=2)
                num=atoi(argv[1]);
        int *arr=new(std::nothrow) int [num];
        srand(time(NULL));
        for(int i=0;i<num;++i){
                arr[i]=rand()%1000>=400?rand()%99:rand()%99*-1;
                std::cout<<arr[i]<<",";
        }
        std::cout<<std::endl;
        int start=0,end=0;
        std::cout<<maxSeq(arr,num,start,end);
        std::cout<<",["<<start<<","<<end<<"]"<<std::endl;
        std::cout<<maxSeqDP(arr,num,start,end);
        std::cout<<",["<<start<<","<<end<<"]"<<std::endl;
        delete []arr;
        return 0;
}

参考

参考下面这篇博客,不同的是,这位作者在数组中元素全为负数的时候,返回的是最小的负数。

http://blog.csdn.net/sgbfblog/article/details/8032464


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值