leetcode-最大子序和

 

 

直接想到动态规划

class Solution {
public:
    int maxSubArray(vector<int>& nums) {

        vector<int> dp(nums.size(),0);

        dp[0] = nums[0];
        for(int i = 1; i < nums.size(); i++){
            if(dp[i-1]<0)  // 负贡献,所以从当前为从新开始
                dp[i] = nums[i];
            else   // 历史加上当前位
                dp[i] = dp[i-1]+nums[i];
        }

        int res = INT_MIN;
        for(int i = 0; i < dp.size(); i++){
            res = max(res, dp[i]);
        }
        return res;
    }
};

 过了一个月没有直接想到动态规划,想到了下面

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum = 0;
        int res = INT_MIN;
        vector<int> temp;
        int start = 0, end = 0;
        int substart = 0, subend = 0;
        for(int i = 0; i < nums.size(); i++){
            if(sum<0){  // 之前和为负贡献,重新开始
                substart = i;
                subend = i;
                sum = nums[i];
            }else{ // 非负贡献,则++
                temp.push_back(nums[i]);
                sum = sum + nums[i];
                subend++;
            }
            if(sum > res){
                start = substart;
                end = subend;
                res = sum;
            }
            // res = max(res,sum);
        }
        cout<< start<<" "<<end<<endl; // 并且返回最大和子数组所在区间
        return res;
    }
};

 

posted @ 2021-07-16 20:43  三一一一317  阅读(40)  评论(0)    收藏  举报