LetCode 53. 最大子序和

static int x=[](){
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}();
// O(n)动态规划方法
// 1. arr[n-1]单独构成最大子数组
// 2. 最大子数组以arr[n-1]结尾
// 3. 最大子数组跟arr[n-1]没关系,最大子数组在arr[0-n-2]范围内,转为考虑元素arr[n-2]
// 从上面我们可以看出,问题分解成了三个子问题,最大子数组就是这三个子问题的最大值,现在我们假设:
// 1. 以arr[n-1]为结尾的最大子数组和为End[n-1]
// 2. 在[0-n-1]范围内的最大子数组和为All[n-1]
// All[i] = max{arr[i],End[i-1]+arr[i],All[i-1] }
// 我们这里可以用end和ans代替End[i - 1] 和 ALL[i - 1],优化空间复杂度
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1)
            return nums[0];
        int ans = nums[0], end = nums[0];
        for (int i = 1; i < nums.size(); i++){
            end = max(end + nums[i], nums[i]);
            ans = max(end, ans);
        }
        return ans;
    }
};

// // O(n)算法,S[i,j] = S[j] - S[i-1],求S[i-1]最小值
// class Solution {
// public:
//     int maxSubArray(vector<int>& nums) {
//         if (nums.size() == 1)
//             return nums[0];
//         for (int i = 1; i < nums.size(); i++)
//             nums[i] += nums[i - 1];
        
//         int min = nums[0];
//         int ans = nums[0];
        
//         for (int i = 1; i < nums.size(); i++){
//             if (nums[i - 1] < min)
//                 min = nums[i - 1];
//             if (nums[i] - min > ans)
//                 ans = nums[i] - min;
//         }
        
//         return ans;
//     }
// };

猜你喜欢

转载自blog.csdn.net/wbb1997/article/details/80989445