题目链接:https://leetcode.com/problems/maximum-product-subarray/#/description
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
.
方法一:
class Solution{
public:
int maxProduct(vector<int>& nums) {
int frontProduct = 1;
int backProduct = 1;
int ans = INT_MIN;
for (int i = 0; i < nums.size(); ++i)
{
frontProduct *= nums[i];
backProduct *= nums[nums.size()-i-1];
ans = max(ans,max(frontProduct,backProduct));
frontProduct = frontProduct == 0 ? 1 : frontProduct;
backProduct = backProduct == 0 ? 1 : backProduct;
}
return ans;
}
};
思路:而对于Product Subarray,要考虑到一种特殊情况,即负数和负数相乘:如果前面得到一个较小的负数,和后面一个较大的负数相乘,得到的反而是一个较大的数,如{2,-3,-7},所以,我们在处理乘法的时候,除了需要维护一个局部最大值,同时还要维护一个局部最小值,由此,可以写出如下的转移方程式:
max_local[i + 1] = Max(Max(max_local[i] * A[i], A[i]), min_local * A[i])
min_local[i + 1] = Min(Min(max_copy[i] * A[i], A[i]), min_local * A[i])
class Solution{
public:
int maxProduct(vector<int>& nums) {
int len=nums.size();
if(len==1)
return nums[0];
int maxm=nums[0],minm=nums[0],res=nums[0];
for(int i=1;i<len;i++)
{
int a=max(max(maxm*nums[i],nums[i]),minm*nums[i]);
int b=min(min(minm*nums[i],nums[i]),maxm*nums[i]);
res=max(max(a,b),res);
maxm=a;
minm=b;
}
return res;
}
};