力扣题解(乘积为正数的最长子数组长度)

1567. 乘积为正数的最长子数组长度

已解答

中等

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度。

本题要求乘积为正数,而整数数组中存在正数和负数两种,因此需要分别用两个数组保存,一个用于保存前面是正数的最大长度(名字为pos),一个用来保存前面是负数的最大长度(名字是negpos),在面对第i个数字为正,负的情况时,若第i个是正,则posi=posi-1+1,negposi=negposi-1+1. 第i个是负数,则posi=negposi-1+1,negposi=posi-1+1.

递归求解即可

复制代码
class Solution {
public:
    int getMaxLen(vector<int>& nums) {
    int n=nums.size();
    vector<int>pos(n+1,0);
    vector<int>negtive(n+1,0);

    int j=0;
    int sum=0;
    for(int i=0;i<n;i++)
    {
       int num=nums[i];
       if(num>0)
       {
        pos[i+1]=pos[i]+1;
        if(negtive[i]!=0)
        negtive[i+1]=negtive[i]+1;
        
       }
       else if(num<0)
       {
        negtive[i+1]=pos[i]+1;
        if(negtive[i]!=0)
        pos[i+1]=negtive[i]+1;
       }
       else
       {
           pos[i+1]=negtive[i+1]=0;         
       }
    }
    
    int ret=pos[0];
    for(int i=1;i<=n;i++)
    {
        if(pos[i]>ret)
        {
            ret=pos[i];
        }
    }

    return ret;
    
    }


};
相关推荐
2601_954526754 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索5 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
c238567 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa8 小时前
指针之总结
c语言·笔记·算法
宵时待雨8 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz8 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2168 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp9 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238569 小时前
C/C++每日一练6
c语言·c++·算法
AI小码9 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程