🧩Algo 动态规划

152. 乘积最大子数组

难度:🟡 Medium | 标签:动归 | 状态:⬜ LeetCode 链接

思路

负数会翻转最大最小,所以同时维护「以 i 结尾」的最大乘积 mx 和最小乘积 mn。 新元素加入时:候选三个 x, mx*x, mn*x,取 max / min。

代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int mx = nums[0], mn = nums[0], best = nums[0];
        for (int i = 1; i < (int)nums.size(); ++i) {
            int x = nums[i];
            int a = mx * x, b = mn * x;
            mx = max({x, a, b});
            mn = min({x, a, b});
            best = max(best, mx);
        }
        return best;
    }
};

复杂度

  • 时间 O(n),空间 O(1)

易错 / 回顾

  • 必须同时维护 max 和 min,不能只算 max
  • max({x, a, b}) 用 initializer_list 形式
  • 不要写 mx = max(mx * x, ...)——这是上一轮的 mx 已被覆盖
Related · 动态规划