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()); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!