leetcode 最大乘积子数组 中等

 

 

和子数组最大和没太大区别。

唯一的就是需要保存两个值,最大乘积和最小乘积,因为存在负数,最小乘积乘上这个负数就可能变最大乘积了.

不用滚动数组优化的代码:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        // dpMin[i].first 表示不包含 i 这个数的最小乘积
        // dpMin[i].second 表示包含 i 这个数的最小乘积
        vector<pair<int, int>> dpMin(nums.size());
        // dpMax 同理
        vector<pair<int, int>> dpMax(nums.size());
        for(int i = 0; i < nums.size(); ++ i) {
            if(i == 0){
                dpMin[i].first = INT_MAX;
                dpMin[i].second = nums[i];
                dpMax[i].first = INT_MIN;
                dpMax[i].second = nums[i];
            } else {
                dpMin[i].first = min(dpMin[i - 1].first, dpMin[i - 1].second);
                dpMin[i].second = min(dpMin[i - 1].second * nums[i], nums[i]);
                dpMin[i].second = min(dpMin[i].second, dpMax[i - 1].second * nums[i]);

                dpMax[i].first = max(dpMax[i - 1].first, dpMax[i - 1].second);
                dpMax[i].second = max(dpMax[i - 1].second * nums[i], nums[i]);
                dpMax[i].second = max(dpMax[i].second, dpMin[i - 1].second * nums[i]);
            }
        }
        return max(dpMax.back().first, dpMax.back().second);
    }
};

 

posted @ 2021-08-16 22:11  rookie_Acmer  阅读(28)  评论(0)    收藏  举报