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

1567. 乘积为正数的最长子数组长度 - 力扣(LeetCode) (leetcode-cn.com)

 

代码

思路:dp,创建两个数组,posti和negav,分别存储以下标i为结尾的最长正数子数组和最长负数子数组。

遍历nums数组,当nums[i]大于0时,以nums[i]为结尾的最长正数子数组长度是posti[i-1],即

posti[i] = posti[i-1] + 1;

而最长负数子数组取决于negav[i-1],如果以nums[i-1]结尾有负数子数组,则最长负数子数组+1,而正数本身不能构成负数数组,故nums[i-1]=0时negav[i]=0;

负数同理。

复制代码
class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        // vector<int> posti;
        // vector<int> negav;
        int ppre, npre, pmax, pn, nn;
        for(int i=0; i<nums.size(); i++){
            if(i){
                if(nums[i] > 0){
                    pn = ppre + 1;
                    nn = npre > 0 ? npre + 1 : 0;
                    // negav.push_back(negav[i-1]>0 ? negav[i-1] + 1 : 0);
                }
                else if(nums[i] < 0){
                    pn = npre > 0 ? npre + 1 : 0;
                    nn = ppre + 1;
                    // posti.push_back(negav[i-1]>0 ? negav[i-1] + 1 : 0);
                    // negav.push_back(posti[i-1] + 1);
                }
                else{
                    pn = nn = 0;
                }
            }
            else{
                pmax = ppre = pn = nums[i] > 0 ? 1 : 0;
                npre = nn = nums[i] < 0 ? 1 : 0;
            }
            ppre = pn;
            npre = nn;
            pmax = max(pmax, pn);
        }
        return pmax;
    }
};
复制代码
复制代码
class Solution {
public:
    int checkSta(int x){
        if(x>0) return 1;
        else if(x<0) return -1;
        else return 0;
    }

    int getMaxLen(vector<int>& nums) {
        vector<int> posti;
        vector<int> negav;
        for(int i=0; i<nums.size(); i++){
            if(i){
                if(nums[i] > 0){
                    posti.push_back(posti[i-1] + 1);
                    negav.push_back(negav[i-1]>0 ? negav[i-1] + 1 : 0);
                }
                else if(nums[i] < 0){
                    posti.push_back(negav[i-1]>0 ? negav[i-1] + 1 : 0);
                    negav.push_back(negav[i-1]>0 ? posti[i-1] + 1 : posti[i-1] + 1);
                }
                else{
                    posti.push_back(0);
                    negav.push_back(0);
                }
            }
            else{
                posti.push_back(nums[i] > 0 ? 1 : 0);
                negav.push_back(nums[i] < 0 ? 1 : 0);
            }
            
        }
        return *max_element(posti.begin(), posti.end());
    }
};
复制代码

 

 

 

 

posted @   柚子z  阅读(176)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示