题目:152. 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.
分析
跟最大的子串和做对比,考虑到一种特殊情况,即负数和负数相乘:如果前面得到一个较小的负数,和后面一个较大的负数相乘,得到的反而是一个较大的数,如{2,-3,-7},所以,我们在处理乘法的时候,除了需要维护一个局部最大值,同时还要维护一个局部最小值
类比最大的子串和的转移方程:
dp[i] = max(S[i]+dp[i-1], S[i])
最大子串积的状态方程为:
MAX = max(MAX*S[i], MIN*S[i], S[i])
MIN = min(MAX*S[i], MIN*S[i], S[i])
代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size() < 1) return 0;
if(nums.size() < 2) return nums[0];
int global = nums[0];
int MAX = nums[0], MIN = nums[0];
for(int i=1; i< nums.size(); i++) {
int a = MAX*nums[i];
int b = MIN*nums[i];
MAX = max(nums[i], max(a, b));
MIN = min(nums[i], min(a, b));
global = max(MAX, global);
}
return global;
}
};