【C++】数组中连续子数组的最大和

题意:Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
计算数组中连续子数组的最大和。
方法一:使用数组index作为辅助数组。index[i]表示的是从0到i的连续子数组的最大值。
在计算index[i]的时候逐步遍历元素i到0的数据,使他们相加,子相加的过程如果有和大于index[i]的就将值赋值给index[i]。
代码如下所示:

int GetMaxSumLength(vector<int> num){
    if(num.size()==0)
        return 0;

    vector<int> index(num.size(),0);
    for(int i=0;i<num.size();++i){
        index[i]=num[i];
        int tempSum=index[i];
        for(int j=i-1;j>=0;j--){
            tempSum+=num[j];
            if(tempSum>index[i])
                index[i]=tempSum;
        }
    }

    int result =num[0];
    for(auto &v: index){
        cout<<v<<"  ";
        if(v>result)
            result=v;
    }

    return result;
}

不得不说这个很二逼的做法,时间复杂度应该是O(n*n),不过贵在其思想,有很多动态规划的时候就是这么来的:使用一个额外空间(如index[]),而index[i]就表示的是从0到i的某个状态,而且要无后效性(一个逼格很高的词,意思就是尽量减少前面数据对于后面数据的影响),最后通过某种递推的方式得到最有的解。
下面是对上述代码的改进:
方法二:思路与方法一基本相同。只是在计算index[i]的时候有所不同。若index[i-1]是负值,则index[i]不变,否则index[i]为index[i-1]+index[i];

int GetMaxSumLength2(vector<int> num){
    if(num.size()==0)
        return 0;
    vector<int> index(num.size(),0);
    index[0]=num[0];
    for(int i=1;i<num.size();++i){
        index[i]=num[i];
        if(index[i-1]>0)
            index[i]+=index[i-1];

    }
    int result =num[0];
    for(auto &v: index){
        cout<<v<<"  ";
        if(v>result)
            result=v;
    }

    return result;

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯拿铁go

你的打赏是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值