题意: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
.
题解: 设置两个数组,分别用来存储当前nums[i]的局部最大值和局部最小值。 最终maxp[]中最大的那个就是ans。
maxp[] -2 6 12 24 72 144*4
input -2 - 3 -4 2 3 -4
minp[] -2 -3 -24 -48 -144 -72*4
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==1) return nums[0];
vector<int> maxp(nums.size());
vector<int> minp(nums.size());
int maxans=nums[0];
maxp[0]=nums[0];
minp[0]=nums[0];
for(int i=1;i<nums.size();i++){
maxp[i]=max(nums[i],max(maxp[i-1]*nums[i],minp[i-1]*nums[i]));
minp[i]=min(nums[i],min(maxp[i-1]*nums[i],minp[i-1]*nums[i]));
maxans=max(maxans,maxp[i]);
}
return maxans;
}
};
我们发现,之前的maxp[]和minp[]没什么用,可以分别用一个变量来代替。将省不少空间。
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int maxans=nums[0];
int maxp=nums[0];
int minp=nums[0];
int tmp=0;
for(int i=1;i<nums.size();i++){
tmp=maxp;
maxp=max(nums[i],max(maxp*nums[i],minp*nums[i]));
minp=min(nums[i],min(tmp*nums[i],minp*nums[i]));
maxans=max(maxans,maxp);
}
return maxans;
}
};