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

题解:力扣1567 - 返回乘积为正数的最长子数组

问题描述

给定一个整数数组 nums,找出乘积为正数的最长子数组的长度。这里的子数组定义为连续元素的序列,乘积为正数指子数组中正数的个数必须大于负数的个数。

解题思路

为了解决这个问题,我们可以使用两个数组 fg 分别表示以当前位置结尾的乘积为正数和乘积为负数的最长子数组长度。

  1. 状态表示

    • f[i]:以 i 位置结尾的乘积为正数的最长子数组长度。
    • g[i]:以 i 位置结尾的乘积为负数的最长子数组长度。
  2. 状态转移方程

    • 当 nums[i] > 0 时:
      • f[i] = f[i-1] + 1
      • g[i] = g[i-1] != 0 ? g[i-1] + 1 : 0
    • 当 nums[i] < 0 时:
      • f[i] = g[i-1] != 0 ? g[i-1] + 1 : 0
      • g[i] = f[i-1] + 1
    • 当 nums[i] == 0 时:
      • 直接令 f[i] = g[i] = 0,因为乘积为零无法满足乘积为正数的条件。
  3. 初始化

    • 初始时,f[0] = g[0] = 0,表示在开始处没有乘积为正数或负数的子数组。
  4. 填表顺序

    • 从数组的第一个元素开始遍历到最后一个元素,依次更新 f[i] 和 g[i] 的值。
  5. 返回值

    • 最终结果为 f 数组中的最大值,即乘积为正数的最长子数组长度。
Java 代码实现

 

package study1.day12;
/*
* 力扣1567 返回乘积为正数的最长子数组
*           思路分析:
*               1.状态表示 f[i]以i位置结尾的积为正数最长的子数组
*                         g[i]以i位置结尾的积为负数最长的子数组
*               2.状态转移方程 f[i] = f[i - 1] + 1  nums[i]为正数 g[i - 1] + 1 nums[i]为负数(== 0 不可)
*                            g[i] = f[i - 1] + 1  nums[i]为负数 f[i - 1] + 1 nums[i]为正数(== 0 不可)
*               3.初始化 任何数 + 0 = 任何数 所以f[0] = g[0] = 0 即可
*               4.填表顺序 正常
*               5.返回值 f[i]中的最大值
*
* */
public class test6 {public int getMaxLen(int[] nums) {//本题先讲我的错误思路:  我没有分析 == 0不可就导致全盘皆输 因为(全为正遇见负f[i]归 0)//我的思维漏洞就是我的想法就是错的,我认为f[i]是保存前面的最大长度(不是以i结尾是全部)这就是我的错误点//记住你:一定要紧跟状态转移方程int n = nums.length;//1.创建f g数组记录历史记录int[] f = new int[n + 1];int[] g = new int[n + 1];//2.初始化f[0] = g[0] = 0;//默认值可以填可以不填int ret = 0;//3.填表for (int i = 1; i <= n; i++) {//这里 == 0的情况没有考虑直接让值 = 0即可int x = f[i - 1] + 1;int y = g[i - 1] + 1;if (nums[i - 1] > 0){f[i] = x;g[i] = g[i - 1] != 0 ? y : 0;} else if (nums[i - 1] < 0) {f[i] = g[i - 1] != 0 ? y : 0;g[i] = x;}ret = Math.max(ret,f[i]);}return ret;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 串行并行数据转换
  • WEB渗透Bypass篇-常规函数绕过
  • 网络安全与国家安全
  • 力扣Hot100-994腐烂的橘子
  • 007 | 期权定价与布莱克-斯科尔斯计算
  • git pull 注意事项
  • 【hadoop】常用命令
  • 四、数字图像处理Matlab实验 第二章 数字图像基础
  • 猫头虎推荐:人类通向AGI之路 史上最重磅的20篇论文你值得学习
  • Docker快速入门指南
  • 简单介绍一下 git reflog
  • 10、MySQL-索引
  • centos7 启动python后端服务与停止服务的sh脚本
  • Django 自定义用户 VS 用户资料
  • SpringBoot排除默认日志框架
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 2017年终总结、随想
  • create-react-app项目添加less配置
  • css系列之关于字体的事
  • ES6 学习笔记(一)let,const和解构赋值
  • ES6简单总结(搭配简单的讲解和小案例)
  • iOS 颜色设置看我就够了
  • leetcode讲解--894. All Possible Full Binary Trees
  • mysql外键的使用
  • PAT A1092
  • Phpstorm怎样批量删除空行?
  • React Transition Group -- Transition 组件
  • 从零开始在ubuntu上搭建node开发环境
  • 开源地图数据可视化库——mapnik
  • 爬虫模拟登陆 SegmentFault
  • 前端_面试
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微服务入门【系列视频课程】
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #宝哥教你#查看jquery绑定的事件函数
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C++)八皇后问题
  • (day18) leetcode 204.计数质数
  • (备份) esp32 GPIO
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)关于pipe()的详细解析
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'