题解 | #乘积为正数的最长连续子数组#
乘积为正数的最长连续子数组
https://www.nowcoder.com/practice/0112b9b5a09048d89309f55ea666db91
#include <iostream>
using namespace std;
const int N=101000;
int n;
int a[N];
int f[N];//以i 结尾的最长连续满足条件序列长度
int main() {
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int tmp=0;//上一个取负号的数组索引
int zero=-1;//上一个取0的数组索引
for(int i=1;i<=n;i++)
{
if(a[i]>0) //为正数直接+1
f[i]=f[i-1]+1;
else if(a[i]<0)//为负数
{
if(tmp==0)//第一个负数 前一个tmp不存在
f[i]=0;
else//不是第一个负数
{
if(zero<i&&zero>tmp) //该负数和上一个负数之间存在0
f[i]=0;
else//两个负数之间不存在0
f[i]=(i-tmp+1)+f[tmp-1];//两负数之间的数组长度加上 上一个负数前一个数字f[tmp-1] 比如说那个数字是正数,就要加上他
}
tmp=i;//更新负数索引
}
else if(a[i]==0)
{
f[i]=0;//数字为0的情况
zero=i;
}
}
int last=0;
for(int i=1;i<=n;i++)
last=max(last,f[i]);
cout<<last;
}
// 64 位输出请用 printf("%lld")

查看4道真题和解析