1567. 乘积为正数的最长子数组长度
思路:贪心。细节看注释
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int maxx=0;//记录最长的正子数组
int z=-1;//记录当前子数组的第一个下标
int first_f=-1;//记录当前子数组的第一个负数的下标
int cur=1;//记录当前子数组的正负符号
for(int i=0;i<nums.size();i++){
if(nums[i]==0){//当遇到0时,将变量都重置
z=-1;
cur=1;
first_f=-1;
continue;
}
if(z==-1) z=i;
if(nums[i]<0){
cur*=-1;
if(first_f==-1)first_f=i;
}
if(cur<0){//当前子数组为负数时,我们就计算[first_f+1,i]之间有多少个数,这一段一定为正
//这样做的原因是,子数组必须是连续的,并且[z,first_f-1]已经被计算过。
maxx=max(maxx,i-first_f);
}
if(cur>0) maxx=max(maxx,i-z+1);
}
return maxx;
}
};