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;
    }
};

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