152. 乘积最大子数组

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;
}
};

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;
}
};