152. 乘积最大子数组
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210331110300942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NDU0ODUy,size_16,color_FFFFFF,t_70)
class Solution {
public:
int maxProduct(vector<int>& nums) {
if(nums.size() == 0) return 0;
int imax = nums[0], imin = nums[0];
int ans = nums[0];
for(int ii = 1; ii < nums.size(); ii++) {
if(nums[ii] < 0) swap(imax, imin);
imin = min(nums[ii], imin * nums[ii]);
imax = max(nums[ii], imax * nums[ii]);
ans = max(ans, imax);
}
return ans;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210331105445796.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NDU0ODUy,size_16,color_FFFFFF,t_70)
class Solution {
public:
int calProduct(vector<int>& nums, int left, int right) {
if(left >= right) return INT_MIN;
int product = 1;
while(left < right) product *= nums[left++];
return product;
}
int maxProduct(vector<int>& nums) {
int left = 0;
int first_neg = -1, last_neg = -1, neg_cnt = 0;
int ans = INT_MIN;
nums.push_back(0);
for(int ii = 0; ii < nums.size(); ii++) {
if(nums[ii] == 0) {
int temp = INT_MIN;
if(ii - left == 1) temp = nums[left];
else if((neg_cnt & 1) == 0) temp = calProduct(nums, left, ii);
else temp = max(calProduct(nums, left, last_neg), calProduct(nums, first_neg+1, ii));
ans = max(ans, temp);
if(ii != nums.size()-1) ans = max(ans, 0);
left = ii + 1;
first_neg = -1, last_neg = -1;
neg_cnt = 0;
}
else if(nums[ii] < 0) {
if(first_neg == -1) first_neg = ii;
last_neg = ii;
neg_cnt++;
}
}
return ans;
}
};