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.
class Solution {
public:
int maxProduct(vector<int>& nums) {
if (nums.size() == 1)
return nums[0];
vector<int>zeropos;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] == 0)
zeropos.push_back(i);
}
long long int max = -1000000;
for (int i = 0; i < zeropos.size() + 1; i++)
{
int k1 = zeropos.empty() || i == 0 ? 0 : zeropos[i - 1] + 1;
if (k1 == nums.size())
{
if (0 > max)
max = 0;
continue;
}
int k2 = zeropos.empty() || i == zeropos.size() ? nums.size() : zeropos[i];
if (k1 == k2 || k2 - k1 == 1 && nums[k1] < 0)
{
if (0 > max)
max = 0;
continue;
}
vector<int>minuspos;
for (int j = k1; j < k2; j++)
if (nums[j] < 0)
minuspos.push_back(j);
vector<long long int>prod(minuspos.size() + 1);
for (int j = 0; j < prod.size(); j++)
{
int n1 = minuspos.empty() || j == 0 ? k1 : minuspos[j - 1] + 1;
int n2 = minuspos.empty() || j == minuspos.size() ? k2 : minuspos[j];
for (int h = n1; h < n2; h++)
if (h == n1)
prod[j] = nums[n1];
else
prod[j] = (prod[j] * nums[h]);
}
if (minuspos.size() == 1)
{
if (prod[0]>max)
max = prod[0];
if (prod[1]>max)
max = prod[1];
}
else if (minuspos.size() % 2 != 0)
{
long long int pp = prod[1] == 0 ? 1 : prod[1];
for (int h = 2; h < prod.size() - 1; h++)
{
pp *= (prod[h] == 0 ? 1 : prod[h])*abs(nums[minuspos[h - 1]]);
}
long long int pp1 = (prod[0] == 0 ? 1 : prod[0])* abs(nums[minuspos[0]]);
long long int pp2 = (prod.back() == 0 ? 1 : prod.back()) * abs(nums[minuspos.back()]);
pp1 = pp1>pp2 ? pp1 : pp2;
if (pp*pp1 > max)
max = pp*pp1;
}
else
{
long long int pp = prod[0] == 0 ? 1 : prod[0];
for (int h = 1; h < prod.size(); h++)
{
pp *= (prod[h] == 0 ? 1 : prod[h])* abs(nums[minuspos[h - 1]]);
}
if (pp > max)
max = pp;
}
}
return max;
}
};
accepted