LeetCode152:Maximum Product Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

这道题是上面连续子数组和问题的扩展吧。非常遗憾没做来出。状态都定义对了。可是状态转移方程没有写出来。
能够定义A[i]表示以i结尾的子数组的最大积。B[i]表示以i结尾的子数组的最小积。这里之所以要记录下最小积是为了预防两个负数相乘结果为正数这样的情况。那么状态转移方程是:
A[i+1]=max{nums[i],nums[i]*A[i],nums[i]*B[i]}
B[i+1]=min(nums[i],nums[i]*A[i],nums[i]*B[i])
编写代码时注意须要将A[i]或B[i]先保存成暂时变量。


最開始时考虑依据nums[i]的正负来更新A[i]和B[i]的值,可是没有准确认识到A[i]和B[i]的转移关系所以导致没有求出来。
runtime:8ms

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int curMax=nums[0];
        int curMin=nums[0];
        int result=curMax;
        for(int i=1;i<nums.size();i++)
        {
            int tmp=curMin;
            curMin=min(nums[i],min(nums[i]*curMax,nums[i]*curMin));
            curMax=max(nums[i],max(nums[i]*curMax,nums[i]*tmp));
            result=max(result,curMax);
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/bhlsheji/p/5386260.html