力扣 152. 乘积最大子数组

81 阅读1分钟

🔗 leetcode.cn/problems/ma…

题目

  • 给一个整数组成的数组 nums,有正有负
  • 返回乘积最大的非空连续子数组的乘积值

思路

  • dp,乘积有正有负,需要都记录下来,乘积最大的 maxdp 和 乘积最小的 mindp
  • maxdp[i] = max(maxdp[i-1] * nums[i], mindp[i-1]* nums[i], nums[i])
  • mindp[i] = min(maxdp[i-1] * nums[i], mindp[i-1]* nums[i], nums[i])
  • 记录这个过程的最大乘积

代码

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> maxdp(n), mindp(n);
        maxdp[0] = nums[0];
        mindp[0] = nums[0];
        int ans = max(maxdp[0], maxdp[0]);
        for (int i = 1; i < nums.size(); i++) {
            maxdp[i] = max(nums[i], maxdp[i-1] * nums[i]);
            maxdp[i] = max(maxdp[i], mindp[i-1]* nums[i]);

            mindp[i] = min(nums[i], mindp[i-1] * nums[i]);
            mindp[i] = min(mindp[i], maxdp[i-1] * nums[i]);
            ans = max(ans, mindp[i]);
            ans = max(maxdp[i], ans);
        }
        
        return ans;
        
    }
};