描述
给定一个长度为 n 的整数数组,请你找出其中最长的乘积为正数的子数组长度。
子数组的定义是原数组中一定长度的连续数字组成的数组。
数据范围:1≤n≤100000
输入描述:
第一行输入一个正整数 n ,表示数组长度。
第二行输入 n 个整数,表示数组中的元素。
输出描述:
输出最长的乘积为正数的子数组长度
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int main()
{
int fuzhi=0,zhengzhi=0,len=0;//存储最长负数值,最长正数值,最长正数值和
int n=0,i;
scanf("%d",&n);
int* arr=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&arr); //遇见0,重新开始计数,任何数成0都是0
if(arr[i]==0)
{
fuzhi=0;
zhengzhi=0;
}else if(arr[i]>0)//遇见正值,则将最长正值加1
{
zhengzhi++;
if(fuzhi!=0)
//如果最长负数值不为0,就加1,因为0代表 还没有出现负值
{
fuzhi++;
}
}else if(arr[i]<0)//遇见负值,将最长正数值与最长负数值交换
{
int temp=fuzhi;
fuzhi=zhengzhi+1;//最长正数值变成最长负数值
if(temp!=0)//前面数组出现过负值
{
zhengzhi=temp+1;//最长负数值变为最长正数值
}
else{//前面没有出现负值,没有包含当前项最长正值
zhengzhi=0;//所以计数清零
}
}
len=len>zhengzhi?len:zhengzhi;//每次更新最长正值数
printf("%d",len);
free(arr);
return 0;
}