剑指Offer42.连续子数组的最大和

  • 剑指Offer42.连续子数组的最大和

  • 题目:
    求数组nums的连续子列的最大和;

  • 思路:下面两种方法实际做的事情相同,只是理解方式不同
    1.扫描一次: O(n) O(1)
    若当前子列和为负代表托整体后腿,因此这一段直接丢,重新开始找;
    不断更新当前最大值curmax和整体最大值resmax;

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int resmax = INT_MIN, curmax = 0;//resmax表示整个数组的最大连续子数组和,curmax表示当前最大连续子数组和

        for (int i = 0; i < nums.size(); ++i) {
            curmax += nums[i];
            resmax = max(resmax, curmax);//更新结果
            curmax = max(curmax, 0);//如果目前<0,说明拖后腿,就丢了
        }
        
        return resmax;
    }
};

2.dp:O(n) ,O(1)
一个数的动态规划,s表示以前一个数结尾的所有连续子数组的最大和,则以当前数结尾的有两种情况:若s<=0,就只要当前数,若s>0,就加上当前数;

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = INT_MIN, s = 0;//res是结果,s是以前一个数结尾的所有子数组中的最大和

        for (int i = 0; i < nums.size(); ++i) {
            s = max(s + nums[i], nums[i]);//以当前i结尾的所有子数组的最大和:若s > 0,则s+nums[i]最大,若s<=0,则丢掉前面的最大;
            res = max(res, s);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值