LeetCode 53

https://leetcode.cn/problems/maximum-subarray/description/

难度:中等

本题有两种做法,分别是前缀和以及动态规划。

前缀和的做法为维护最小前缀和,答案为当前前缀和减去最小前缀和。

动态规划的转移方程为 \(f[i] = max(f[i-1],0) + nums[i]\)。

时间复杂度:O(n),其中 n 为 nums 的长度。

空间复杂度:O(1)。仅用到若干额外变量。

前缀和:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = INT_MIN;
        int min_pre_sum = 0;
        int pre_sum = 0;
        for (int x: nums) {
            pre_sum += x;
            ans = max(ans, pre_sum - min_pre_sum);
            min_pre_sum = min(min_pre_sum, pre_sum);
        }
        return ans;
    }
};

动态规划:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = INT_MIN; // 注意答案可以是负数,不能初始化成 0
        int f = 0;
        for (int x : nums) {
            f = max(f, 0) + x;
            ans = max(ans, f);
        }
        return ans;
    }
};