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;
}
};
最大乘积子数组求解
本文介绍了一种使用动态规划解决最大乘积子数组问题的方法。通过维护两个数组,分别记录以每个元素结尾的子数组中最大的正数乘积和最小的负数乘积,实现了高效地找到给定数组中连续子数组的最大乘积。

531

被折叠的 条评论
为什么被折叠?



