Maximum Product Subarray
Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example 1:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
解法1
构建两个动态数组,f[i]记录子数组[0, i]范围内并且一定包含nums[i]数字的最大子数组乘积,g[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最小子数组乘积。
那么遍历到nums[i]时,最大值和最小值一定在f[i-1]*nums[i],g[i-1]*nums[i],和nums[i]中产生。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
vector<int> f(n,0), g(n,0);
f[0] = g[0] = nums[0];
int res = f[0];
for(int i=1;i<n;i++){
f[i] = max(max(f[i-1]*nums[i], g[i-1]*nums[i]), nums[i]);
g[i] = min(min(f[i-1]*nums[i], g[i-1]*nums[i]), nums[i]);
res = max(res, f[i]);
}
return res;
}
};
解法2
不用构建新数组来记录,直接使用两个变量mx和mn分别记录当前最大值和当前最小值。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int mx = nums[0],mn = nums[0];
int res = nums[0];
for(int i=1;i<n;i++){
int tmax = mx, tmin = mn;
mx = max(max(tmax*nums[i], tmin*nums[i]), nums[i]);
mn = min(min(tmax*nums[i], tmin*nums[i]), nums[i]);
res = max(mx, res);
}
return res;
}
};
解法3
先从前往后扫一遍,再从后往前扫一遍,遇到0就把p=1.
int maxProduct(vector<int>& nums) {
int res = nums[0], prod = 1, n = nums.size();
for (int i = 0; i < n; ++i) {
res = max(res, prod *= nums[i]);
if (nums[i] == 0) prod = 1;
}
prod = 1;
for (int i = n - 1; i >= 0; --i) {
res = max(res, prod *= nums[i]);
if (nums[i] == 0) prod = 1;
}
return res;
}
参考
https://www.cnblogs.com/grandyang/p/4028713.html