LeetCode 152

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

难度:中等

动态规划,类似 LeetCode 53 最大子数组和。由于负负得正,需要维护以 i 结尾的连续子数组乘积的最大值和最小值。

f_max[i] = max({f_max[i - 1] * x, f_min[i - 1] * x, x});
f_min[i] = min({f_max[i - 1] * x, f_min[i - 1] * x, x});

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

空间复杂度:O(n)。

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> f_max(n), f_min(n);
        f_max[0] = f_min[0] = nums[0];
        for (int i = 1; i < n; i++) {
            int x = nums[i];
            // 把 x 加到右端点为 i-1 的(乘积最大/最小)子数组后面,
            // 或者单独组成一个子数组,只有 x 一个元素
            f_max[i] = max({f_max[i - 1] * x, f_min[i - 1] * x, x});
            f_min[i] = min({f_max[i - 1] * x, f_min[i - 1] * x, x});
        }
        return *max_element(f_max.begin(), f_max.end());
    }
};