ind 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
.
题目意思是让求最大子串的乘积
我想了一下,先按0的位置把整个串分段,然后去数每个段负数的个数,如果为偶数,直接相乘,如果是奇数,掐头去尾负数,剩下数求乘积,在更新到max中去、
还要考虑特殊情况,比如整个段只有一个数,比如都输入0的时候。
然后由于我设置了很多旗帜变量,调了一早上才过的,妈蛋。
刷完leetcode势在必行!,刷完再狠狠装一次逼!比如发微博说leetcode不过如此之类的
是时候出来拯救世界了!
下面贴代码
class Solution {
public:
int maxProduct(int A[], int n) {
int start=-1,end=-1;
int min=-2;
int flag=1;
int is_zeor=0;
for(int i=0;i<n;i++)
{
if(A[i]!=0)
{
if(i==0||A[i-1]==0)
{
start=i,end=i-1;
}
end++;
}else is_zeor=1;
if((i-1>=0&&(A[i-1]!=0)&&(A[i]==0))||(i==n-1&&A[i]!=0))
{
//cout<<start<<","<<end<<endl;
int count=0;
for(int j=start;j<=end;j++)
if(A[j]<0)
count++;
if(count%2==0)
{
int sum=1;
for(int k=start;k<=end;k++)
sum=sum*A[k];
if(flag)
min=sum;
else if(sum>min)
min=sum;
flag=0;
}
else
{
// cout<<flag<<"gege"<<endl;
int sum=1,flag1=0;
if(end-start==0)
{
sum=A[end];
}
else
{
for(int j=start;j<=end;j++)
{
if(A[j]<0&&!flag1)
{
flag1=1;
continue;
}
if(flag1)
sum=sum*A[j];
}
if(flag)
{
min=sum;
}
else if(sum>min)
min=sum;
flag=0;
sum=1;flag1=0;
for(int j=end;j>=start;j--)
{
if(A[j]<0&&!flag1)
{
flag1=1;
continue;
}
if(flag1)
sum=sum*A[j];
}
// cout<<sum<<"uu"<<endl;
}
if(flag)
{
min=sum;
flag=0;
}
else if(sum>min)
min=sum;
flag=0;
}
}
}
if(start==-1||(is_zeor&&min<0))
return 0;
else
{
return min;
}
}
};