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