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());
    }
};

 

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

 

 1567. 乘积为正数的最长子数组长度_其他_02