1567.正数的最长子数组长度
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
思路
维护两个变量
len_p:以i元素结尾的最大正子数组长度
len_n:以i元素结尾的最大负子数组长度
初始值都为0
分三种情况
1.nums[i]=0
遇到
0
0
0将数组截断,将len_p和len_n都置为0;
2.nums[i]>0
此时nums[i]不会影响正负
则
l e n p = l e n p + 1 len_p=len_p+1 lenp=lenp+1;
len_n分情况讨论,如果
l
e
n
p
=
=
0
len_p==0
lenp==0说明以i-1结尾的元素没有负子数组,那么保持为0;如果不等于0,
l
e
n
p
=
l
e
n
p
+
1
len_p=len_p+1
lenp=lenp+1;
3.nums[i]<0
此时正负翻转
暂存temp=len_p;
如果len_n==0没有负子数组,例如[0,-1],[-1]这种情况
那么len_p=len_n;
如果len_n!=0;len_p=len_n+1;
len_n=temp+1;
然后比较res和len_p的大小即可。
以下为代码参考
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int res=0,len_p=0,len_n=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==0)
{
len_p=0;
len_n=0;
}else if(nums[i]>0)
{
len_p++;
len_n=len_n==0?len_n:len_n+1;
}
else{
int temp=len_p;
if(len_n==0)
{
len_p=len_n;
}
else{
len_p=len_n+1;
}
len_n=temp+1;
}
res=max(res,len_p);
}
return res;
}
};