/*
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.
*/
#include <iostream>
using namespace std;
/*
超时O(n2)
class Solution{
public:
int maxProduct(int A[],int n)
{
int * temp = new int[n];
int maxproduct = A[0];
for(int i = 0;i < n;i ++)
temp[i] = 1;
for(int j = 0;j < n;j ++)// j 连续的项数-1
{ for(int i = 0;i < n - j;i ++)
{
temp[i] *= A[i + j];
if(temp[i] > maxproduct)
{
maxproduct = temp[i];
}
cout << i + j << endl;
}
}
delete [] temp;
return maxproduct;
}
};
*/
//动态规划 思路
// s[i] :表示以第i个结尾的乘积
// s`[i] 表示以第i个结尾的最小连续乘积
// s[i] = max(A[i],s[i-1]*A[i],s`[i-1]*A[i])
// s`[i] = max(A[i],s[i-1]*A[i],s`[i-1]*A[i])
class Solution{
public:
int maxProduct(int A[],int n)
{
int maxhere = A[0];
int minhere = A[0];
int maxpre = A[0];
int minpre = A[0];
int maxproduct = A[0];
for(int i = 1;i < n;i ++)
{
maxhere = max(maxpre*A[i],minpre*A[i],A[i]);
minhere = min(maxpre*A[i],minpre*A[i],A[i]);
maxproduct = max(maxproduct,maxhere,A[0]);
maxpre = maxhere;
minpre = minhere;
}
return maxproduct;
}
int max(int s1,int s2,int s3)
{
if(s1 < s2)
{
if(s2 < s3)
return s3;
else
return s2;
}
else
{
if(s1 > s3)
return s1;
else
return s3;
}
}
int min(int s1,int s2,int s3)
{
if(s1 < s2)
{
if(s1 < s3)
return s1;
else
return s3;
}
else
{
if(s2 < s3)
return s2;
else
return s3;
}
}
};
使用O(1)空间复杂度和O(n)空间复杂度