Maximum Product Subarray
Total Accepted: 48973
Total Submissions: 231867
Difficulty: Medium
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
.
由于负数的存在,需要同时记录最大值maxDp和最小值minDp(最小值再乘负数可能成为最大值)
java code:
public int maxProduct(int[] nums) {
// 由于负数的存在,需要同时记录最大值和最小值(最小值再乘负数可能成为最大值)
int[] minDp = new int[nums.length];
int[] maxDp = new int[nums.length];
minDp[0] = maxDp[0] = nums[0];
int max = maxDp[0];
for (int i = 1; i < nums.length; i++) {
minDp[i] = min(nums[i], minDp[i - 1] * nums[i], maxDp[i - 1] * nums[i]);
maxDp[i] = max(nums[i], minDp[i - 1] * nums[i], maxDp[i - 1] * nums[i]);
max = Math.max(max, maxDp[i]);
}
return max;
}
private int min(int a, int b, int c) {
return Math.min(a, Math.min(b, c));
}
private int max(int a, int b, int c) {
return Math.max(a, Math.max(b, c));
}
空间优化后:
code:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
int front=1,back=1;
int product = INT_MIN;
for(int i=0;i<n;i++) {
front *= nums[i];
back *= nums[n-i-1];
product = max(product, max(front, back));
front = front?front:1;
back = back?back:1;
}
return product;
}
};