这种类型题以前做过,从前往后和从后往前各算一遍就可以得到结果。
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
示例 1:
输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24 。
示例 2:
输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。
注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。
示例 3:
输入:nums = [-1,-2,-3,0,1]
输出:2
解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 。
提示:
1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
int f(int x,int y)
{
return x>y?x:y;
}
int getMaxLen(int* nums, int numsSize){
int i,sum_1=0,sum_2=0,sum_3=0,MAX=-1;
for(i=0;i<numsSize;i++)
{
if(nums[i]==0){
sum_1=0;
sum_2=0;
sum_3=0;
}else if(nums[i]>0){
if(sum_1%2==0)
{
sum_2++;
}else{
sum_3++;
}
}else{
sum_1++;
if(sum_1%2==0&&sum_1!=0)
{
sum_2+=2+sum_3;
sum_3=0;
}
}
MAX=f(MAX,f(sum_3,sum_2));
}
sum_1=0,sum_2=0,sum_3=0;
for(i=numsSize-1;i>=0;i--)
{
if(nums[i]==0){
sum_1=0;
sum_2=0;
sum_3=0;
}else if(nums[i]>0){
if(sum_1%2==0)
{
sum_2++;
}else{
sum_3++;
}
}else{
sum_1++;
if(sum_1%2==0&&sum_1!=0)
{
sum_2+=2+sum_3;
sum_3=0;
}
}
MAX=f(MAX,f(sum_3,sum_2));
}
return MAX;
}
刚开始四处碰壁,导致没有解出来。。。。最后突然想到换一个方向即可。。。