LeetCode第 152 题:乘积最大子数组(C++)

152. 乘积最大子数组 - 力扣(LeetCode)

要求是连续的子数组,动态规划但是要考虑负数的情况,所以需要维护当前最大值,最小值。

乘积最大子数组 - 乘积最大子数组 - 力扣(LeetCode)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        vector<int> maxf(nums), minf(nums);
        for(int i = 1; i < n; ++i){
            maxf[i] = max(maxf[i-1] * nums[i], max(nums[i], minf[i-1] * nums[i]));
            minf[i] = min(minf[i-1] * nums[i], min(nums[i], maxf[i-1] * nums[i]));
        }
        return *max_element(maxf.begin(), maxf.end());
    }
};

优化:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        int res = nums[0];
        int maxf = nums[0], minf = nums[0];
        for(int i = 1; i < n; ++i){
            int mx = maxf, mn = minf; //临时变量
            maxf = max(mx * nums[i], max(nums[i], mn * nums[i]));//三者取最大
            minf = min(mn * nums[i], min(nums[i], mx * nums[i]));//三者取最小
            res = max(res, maxf);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_32523711/article/details/107923308