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(int A[], int n)
{
int startPos = -1, startNeg = -1;
int resPos = 1, resNeg = 1, res = INT_MIN;
for (int i = 0; i < n; i++)
{
res = max(res, A[i]);
if (0 == A[i])
{
resPos = 1;
resNeg = 1;
startPos = -1;
startNeg = -1;
continue;
}
if (A[i] > 0 && -1 == startPos)
startPos = i;
if (A[i] < 0 && -1 == startNeg)
startNeg = i;
if (-1 != startPos)
resPos *= A[i];
if (-1 != startNeg)
resNeg *= A[i];
if (startPos != -1)
res = max(res, resPos);
if (startNeg != -1)
res = max(res, resNeg);
if (startNeg != -1 && A[startNeg] != resNeg)
res = max(res, resNeg/A[startNeg]);
}
return res;
}
};
通过后发现可以稍微改进一下,没必要记录第一个正数位置。第一个负数是影响整个结果的关键,除去它或保留它都有可能产生 Maximum Product
class Solution {
public:
int maxProduct(int A[], int n)
{
if (0 == n) return 0;
int res = A[0];
int resBegin=1, resNeg=1, startNeg=-1;
for (int i = 0; i < n; i++)
{
res = max(res, A[i]);
if (0 == A[i])
{
resBegin = 1;
resNeg = 1;
startNeg = -1;
continue;
}
resBegin *= A[i];
res = max(res, resBegin);
if (-1 == startNeg && A[i] < 0)
startNeg = i;
if (-1 != startNeg)
{
resNeg *= A[i];
res = max(res, resNeg);
if (resNeg != A[startNeg])
res = max(res, resNeg/A[startNeg]);
}
}
return res;
}
};
再次修改简化后的,发现只要i和start negative不是同一个位置,就可以去掉多余判断
class Solution
{
public:
int maxProduct(int A[], int n)
{
if (0 == n) return 0;
int res = A[0];
int resBegin=1, resNeg=1, startNeg=-1;
for (int i = 0; i < n; i++)
{
res = max(res, A[i]);
if (0 == A[i])
{
resBegin = 1;
resNeg = 1;
startNeg = -1;
continue;
}
resBegin *= A[i];
res = max(res, resBegin);
if(-1 != startNeg)
{
resNeg *= A[i];
res = max(res, max(resNeg, resNeg/A[startNeg]));
}
if (-1 == startNeg && A[i] < 0)
startNeg = i;
}
return res;
}
};