leetcode 152 Maximum Product Subarray

题意:最大子段乘积。

 

解法:一开始按最大子段和写了一个……果断挂了……因为负数乘以负数会变正不像加法会越加越少,所以我就把dp变成二维数组,第一维表示以第i个数结尾的子段积中为正数的最大的值,第二维表示以第i个数结尾的子段积中为负数的绝对值最大的值,dp方程就是按正负相乘的规则讨论一下就可以了……具体看代码。

 

代码:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        vector<int> dp[2];
        dp[0].push_back(1);
        dp[1].push_back(1);
        int ans = INT_MIN;
        for(int i = 0; i < nums.size(); i++) {
            if(nums[i] > 0) {
                dp[0].push_back(max(nums[i], nums[i] * dp[0][i]));
                dp[1].push_back(min(nums[i], nums[i] * dp[1][i]));
            }
            else {
                dp[0].push_back(max(nums[i], nums[i] * dp[1][i]));
                dp[1].push_back(min(nums[i], nums[i] * dp[0][i]));
            }
            ans = max(ans, dp[0][i + 1]);
            ans = max(ans, dp[1][i + 1]);
        }
        return ans;
    }
};

  

你可能感兴趣的:(leetcode 152 Maximum Product Subarray)