当前位置: 首页 > 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;}
}

http://www.lryc.cn/news/420056.html

相关文章:

  • 009 | 上证50ETF基金数据分析及预测
  • Wakanda: 1靶场复现【附代码】(权限提升)
  • 内核函数调试
  • Spring IOC使用DButil实现对数据库的操作
  • Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
  • vue中怎么自定义组件
  • BM1反转链表[栈+头插法]
  • VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔
  • 学单片机怎么在3-5个月内找到工作?
  • 探索设计模式:观察者模式
  • gradio之持续输入,持续输出(流式)
  • Git 常用命令指南:从入门到精通
  • Camera驱动 汇总表【小驰行动派】
  • SSRS rdlc报表 九 在.net core中使用RDLC报表
  • 力扣(2024.08.10)
  • Django-文件上传
  • [Meachines] [Easy] valentine SSL心脏滴血+SSH-RSA解密+trp00f自动化权限提升+Tmux进程劫持权限提升
  • 利用单张/多张图内参数标定 OpenCV Python
  • The Llama 3 Herd of Models 第7部分视觉实验部分全文
  • 亚信安慧AntDB-T:使用Brin索引提升OLAP查询性能以及节省磁盘空间
  • web渗透测试常用命令
  • Kylin系列(二)使用
  • CI/CD——CI持续集成实验
  • 2.4 大模型数据基础:预训练阶段数据详解 ——《带你自学大语言模型》系列
  • Kali Linux——网络安全的瑞士军刀
  • UML建模-测试用例
  • Python知识点:如何使用Socket模块进行网络编程
  • 培训第二十一天(mysql用户创建与授权、角色创建)
  • makefile基本语法
  • 白骑士的PyCharm教学实战项目篇 4.4 大数据处理与分析