【LeetCode】53.Maximum Subarray最大连续子序列和

7 篇文章 0 订阅

给定数组 [-2,1,-3,4,-1,2,1,-5,4],子序列[4,-1,2,1] 有最大和6。


【解题思路】
老师上课讲的经典的一道动态规划。
f[i]:表示以元素ai为结尾的子序列的最大和。
当i=0,f[i]=ai
当i>0,
如果f[i-1]<0,则重新开始规划一个子序列,f[i]=ai;
如果f[i-1]>=0,f[i]=f[i-1]+ai
答案:max{f[0],f[1],....,f[n]}。
T(n)=O(n)。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> f;	//vector<int> f(nums.size(), 0);//初始化的另一种方法,全填充0
        f.push_back(nums[0]);	//f[0]=nums[0];
        if(nums.size()==0){
            return 0;
        }
        if(nums.size()==1){
            return nums[0];
        }
        else{
            for(int i=1; i<nums.size(); i++){
                if(f[i-1]<0){
                    f.push_back(nums[i]);	//f[i]=nums[i];
                }
                else{
                    f.push_back(f[i-1]+nums[i]);	//f[i]=f[i-1]+nums[i];
                }
            }
            sort(f.begin(), f.end());
            return f[f.size()-1];
        }
    }
};

【其他解法】
还有个很好的算法——Kadane算法,用两个变量分别存当前位置的最大和and整体最大和。
T(n)O=(n),S(n)=O(1)

//最好不要直接初始化最大和为0,而应该初始化为第一个元素的值,然后i遍历1~n-1:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//两个变量分别存:当前位置的最大和,整体最大和(最后的答案)
        int max_cur = nums[0], max_all = nums[0];
        if(nums.size() == 1){
            return nums[0];
        }
        for(int i = 1; i < nums.size(); i++){
            max_cur = max(max_cur + nums[i], nums[i]);
            max_all = max(max_cur, max_all);
        }
        return max_all;
    }
};
一开始写的是如下代码,报错:
//报错“reference binding to null pointer of type 'value_type'”
//因为我定义的vec没有push_back任何东西进去
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> vec;
        vec[0] = nums[0];
        for(int i=1; i<nums.size(); i++){
            vec[i] = max(nums[i], vec[i-1]+nums[i]);
        }
        int ans=0;
        for(int i=1; i<vec.size(); i++){
            ans = max(ans, vec[i]);
        }
        return ans;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值