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