152. 乘积最大子数组

常规解法: DP

求数组中子区间的最大乘积,对于乘法,我们需要注意,负数乘以负数,会变成正数,所以解这题的时候我们需要维护两个变量,当前的最大值,以及最小值,最小值可能为负数,但没准下一步乘以一个负数,当前的最大值就变成最小值,而最小值则变成最大值了。

 

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        if(n == 0){
            return 0;
        } else if(n == 1) {
            return nums[0];
        }
        int p = nums[0];
        int maxP = nums[0];
        int minP = nums[0];
        for(int i = 1; i < n; i++) {
            int t = maxP;
            maxP = max(max(maxP * nums[i], nums[i]), minP *nums[i]);
            minP = min(min(t * nums[i], nums[i]), minP * nums[i]);
            p = max(maxP, p);
        }
        return p;
    }
};

Ad hoc解法:

如果全为正数,则整个数组的乘积最大;

若奇数个数为偶数,依然可以将整个数组乘起来得到最大值;

若为奇数个,则可以丢掉最左或最右的那个奇数;

若中途有0, 需要更新当前乘积为1。

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int n = nums.size();
        if(!n) return 0;
        int ans = 1, res = nums[0];
        for(int i = 0; i < n; i++) {
            ans *= nums[i];
            res = max(ans, res);
            if(!nums[i]) ans = 1;
        }

        ans = 1;
        for(int i = n - 1; i >= 0; i--) {
            ans *= nums[i];
            res = max(ans, res);
            if(!nums[i]) ans = 1;
        }
        return res;
    }
};

 

 

posted on 2021-03-26 10:25  hannah_id  阅读(98)  评论(0)    收藏  举报

导航