当前位置: 首页 > news >正文

【算法】【动规】乘积为正数的最长子数组长度


跳转汇总链接

👉🔗算法题汇总链接


1.1 乘积为正数的最长子数组长度

🔗题目链接

给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。

在写代码前,务必先做好这五步!梳理清楚思路,写代码只是顺手的事儿,这是第一道题,所以会详细描述分析方法,后面的题也是同一个流程~

  1. 状态表示
    • 本题得需要两个 dp 表,这里做 f 表和 g 表(设两个表不是一开始就能看出来的,是分析后得出的。先按照题意设一个记录乘积为正数的的最长子数组的长度 f 表,后面在分析正负数情况的时候发现还需要一个记录负数的,于是增添了 g 表)
    • f[i] 表示:以 i 位置元素为结尾乘积为正数的最长子数组的长度
    • g[i] 表示:以 i 位置元素为结尾乘积为负数的最长子数组的长度
  2. 状态转移方程在这里插入图片描述
    • 分析 f:首先将“子数组乘积为正数”中的“子数组”,分为自身和自身+之前的解,按照题意分为长度为1或者长度大于1,可以分析状态转移方程(如下) 在这里插入图片描述
      • 原本需要分成这两类,是因为一般会取 max(自身,自身+之前的解) 或是 min(自身,自身+之前的解),但是这道题我们可以观察到,列出来的方程中 nums[i] 符号相同时的情况可以覆盖另一个,所以方程可以简单写成如下。
        在这里插入图片描述
    • g 表的分析同理。
      在这里插入图片描述
  3. 初始化
    • 涉及到 -1 的位置可能在填表的时候越界,这里选用在表的首部多加一个空格的方式防止越界,初始化内容为 0,不会影响后续表的填写。
  4. 填表顺序
    • 从左往右,两张表一起填。
  5. 返回值
    • f 表里的最大值。

🐎代码如下:

class Solution {
public:int getMaxLen(vector<int>& nums) {// 1. 创建 dp 表int n = nums.size();vector<int> f(n + 1);   // 乘积为正数的最长数auto g = f;             // 乘积为负数的最长数// 2. 初始化int fmax = 0;f[0] = g[0] = 0;// 3. 誊写状态转移方式for(int i = 1; i < n + 1; i++){if(nums[i - 1] > 0){f[i] = f[i-1] + 1;g[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;}else if(nums[i - 1] < 0){f[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;g[i] = f[i-1] + 1;}fmax = max(fmax, f[i]);}// 4. 返回值return fmax;}
};

🥰如果本文对你有些帮助,欢迎👉 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 若有差错恳请留言指正~~


相关文章:

  • 【期末复习向】n元gram的应用
  • CentOS 防火墙管理及使用的redis基本常用命令
  • EasyExcel-最简单的读写excel工具类
  • 【Vue】日常错误总结(持续更新)
  • acwing算法提高之动态规划--状态机模型
  • Python接口自动化 —— Json 数据处理实战(详解)
  • 2019年第八届数学建模国际赛小美赛C题预测通过拥堵路段所需的时间解题全过程文档及程序
  • JAVA的关键字、标识符和命名规范
  • 【计算机网络】UDP报文详解
  • WPF使用WebBrowser报脚本错误问题处理
  • Linux 常用命令----mktemp 命令
  • 使用Postman如何在接口测试前将请求的参数进行自定义处理
  • 企业IT安全:内部威胁检测和缓解
  • 租一台服务器多少钱决定服务器的价格因素有哪些
  • ubuntu下搜索文件的几种方法
  • 【React系列】如何构建React应用程序
  • Go 语言编译器的 //go: 详解
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java IO学习笔记一
  • Java方法详解
  • JS笔记四:作用域、变量(函数)提升
  • JS函数式编程 数组部分风格 ES6版
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • SQLServer插入数据
  • Vim Clutch | 面向脚踏板编程……
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • Yeoman_Bower_Grunt
  • 安装python包到指定虚拟环境
  • 初探 Vue 生命周期和钩子函数
  • 服务器从安装到部署全过程(二)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​业务双活的数据切换思路设计(下)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #define、const、typedef的差别
  • (0)Nginx 功能特性
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (ros//EnvironmentVariables)ros环境变量
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (七)理解angular中的module和injector,即依赖注入
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (五)网络优化与超参数选择--九五小庞
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Sql Server 保留几位小数的两种做法
  • (转)程序员疫苗:代码注入
  • .NET 8.0 发布到 IIS
  • .NET Core 中的路径问题
  • .Net Web窗口页属性
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .skip() 和 .only() 的使用