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
.
解题思路
动态规划:
- 用 positive_max[i] 表示以第 i 个数结尾的子数组乘积中正数的最大值
- 用 negative_min[i] 表示以第 i 个数结尾的子数组乘积中负数的最小值
则状态转移方程为:
if A[x] > 0:
positive_max[x] = max(positive_max[x - 1] * A[x], A[x])
negative_min[x] = negative_min[x - 1] * A[x]
elif A[x] < 0:
positive_max[x] = negative_min[x - 1] * A[x]
negative_min[x] = min(positive_max[x - 1] * A[x], A[x])
代码如下:
class Solution {
public:
int maxProduct(vector<int>& nums) {
if (nums.size() == 0) return 0;
int n = nums.size();
int positive_max[n];
int negative_min[n];
if (nums[0] > 0) {
positive_max[0] = nums[0];
negative_min[0] = 0;
}
else {
positive_max[0] = 0;
negative_min[0] = nums[0];
}
int ans = nums[0];
for (int i = 1; i < n; ++i) {
if (nums[i] > 0) {
positive_max[i] = max(positive_max[i-1] * nums[i], nums[i]);
negative_min[i] = negative_min[i-1] * nums[i];
}
else {
positive_max[i] = negative_min[i-1] * nums[i];
negative_min[i] = min(positive_max[i-1] * nums[i], nums[i]);
}
if (positive_max[i] > ans) {
ans = positive_max[i];
}
}
return ans;
}
};