每日一题 ~乘积最大子数组

news2024/9/20 12:42:10

 

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-product-subarray/description/
题目分析

题目要求找出给定整数数组中乘积最大的连续子数组,并返回这个乘积。

思路分析

这道题可以使用动态规划来解决。关键是维护两个状态数组 fg,其中:

  • f[i] 表示以第 i 个元素结尾的最大子数组乘积;
  • g[i] 表示以第 i 个元素结尾的最小子数组乘积。

为什么需要维护最小值 g[i] 呢?因为负数乘以负数会变成正数,所以需要同时维护最大值和最小值来应对乘积的变化情况。

状态转移方程

对于第 i 个元素:

  • f[i] 的计算方式:
    • f[i] = max(nums[i], f[i-1] * nums[i], g[i-1] * nums[i])
    • 即当前元素自身、前一个最大乘积乘以当前元素、前一个最小乘积乘以当前元素的最大值。
  • g[i] 的计算方式:
    • g[i] = min(nums[i], f[i-1] * nums[i], g[i-1] * nums[i])
    • 即当前元素自身、前一个最大乘积乘以当前元素、前一个最小乘积乘以当前元素的最小值。

初始化

初始状态为:

  • f[0] = nums[0]
  • g[0] = nums[0]

最终结果

最终结果即 f 数组中的最大值,即为整个数组中乘积最大的连续子数组的乘积。

代码实现 

package study1.day12;
/*
*152. 乘积最大子数组
*       思路分析:
*             1.状态表示 f[i]以i位置为结尾的最大子数组的和
*                       g[i]以j位置为结尾的最小子数组的和
*                           在最大值中 > 0 乘最大值   < 0 乘最小值
*             2.状态转移方程 f[i] = max(sum[i],sum[i] * f[i - 1],sum[i] * g[i - 1])
*                           在最小值中 > 0 乘最最小值   < 0 乘最大值
*                          g[i] = min(sum[i],sum[i] * g[i - 1],sum[i] * f[i - 1])
*             3.初始化 f[0] = 1  g[0] = 1 (任何数 * 1都等于任何数)
 *
*           总结一下: 本题主要是两个dp一个记录最大 一个记录最小
*                       因为本题存在负数当为负数的时候最大值就会变成最小值然后再转换
*                       所以本题一定要分正数在划分一下dp的最小状态
* */
public class test5 {
    public int maxProduct(int[] nums) {
        int n = nums.length;
        //1.创建f g 数组用来存储历史记录
        int[] f = new int[n];
        int[] g = new int[n];
        //2.初始化
        f[0] = g[0] = 1;
        int retMax = Integer.MIN_VALUE;
        //3.填表
        for (int i = 1; i <= n; i++) {
            f[i] = Math.max(Math.max(nums[i - 1],f[i - 1] * nums[i - 1]),g[i - 1] * nums[i - 1]);
            retMax = Math.max(retMax,f[i]);
            g[i] = Math.min(Math.min(nums[i - 1],g[i - 1] * nums[i - 1]),f[i - 1] * nums[i - 1]);
        }
        return retMax;
     }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载A2B芯片AD2428 IIC功能介绍

车载A2B芯片AD2428 IIC功能介绍 一&#xff0c;功能描述二&#xff0c;架构概念2.1 I2C接口2.2 I2C时钟拉伸2.3 收发器I2C接口2.4 收发器I2C访问延迟 一&#xff0c;功能描述 A2B收发器在节点之间的距离上连接多通道I2S&#xff08;IC间声音&#xff09;同步脉冲编码调制&…

Realize LIVE 2024 | 庭田科技参与2024西门子用户大会

7月24日至25日&#xff0c;西门子“2024大中华区Realize LIVE用户大会”在上海盛大开幕。作为西门子在工业软件领域的年度盛会&#xff0c;此次大会不仅是一场科技的盛宴&#xff0c;更是一次探索工业未来、推动行业数智化转型的深度对话。大会以“让数字转型立现真章”为主题&…

Sonar-Scanner: 静态代码分析的利器

Sonar-Scanner: 静态代码分析的利器 懂得享受生活的过程&#xff0c;人生才会更有乐趣。每个人都会遇到一些陷阱&#xff0c;每个人都有过去&#xff0c;有的甚至是失败的往事。过去的错误和耻辱只能说明过去&#xff0c;真正能代表人一生的&#xff0c;是他现在和将来的作为。…

EmoBench:评估大模型的情感智能

人工智能咨询培训老师叶梓 转载标明出处 情感智能是识别、理解和管理自己和他人的情感的能力&#xff0c;对于塑造人际关系、改善决策和影响整体福祉至关重要。尽管情感智能系统被认为具有相似的好处&#xff0c;但现有研究主要集中于情绪识别&#xff0c;忽视了情绪调节和通过…

传知代码-上下位关系自动检测方法(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中&#xff0c;上下位关系&#xff08;Is-a Relations…

单链表的应用(附代码)

链表 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。其实链表可以想象为小火车&#xff0c;链表比顺序表具有更好的灵活性&#xff0c;只需要通过指针的改变就可以实现增删查改。 这是逻辑思维下链表的样…

使用TensorRT对YOLOv8模型进行加速推理

这里使用GitHub上shouxieai的 infer框架 对YOLOv8模型进行加速推理&#xff0c;操作过程如下所示&#xff1a; 1.配置环境&#xff0c;依赖项&#xff0c;包括&#xff1a; (1).CUDA: 11.8 (2).cuDNN: 8.7.0 (3).TensorRT: 8.5.3.1 (4).ONNX: 1.16.0 (5).OpenCV: 4.10.0 2.clon…

redis:Linux安装redis,redis常用的数据类型及相关命令

1. 什么是NoSQL nosql[not only sql]不仅仅是sql。所有非关系型数据库的统称。除去关系型数据库之外的都是非关系数据库。 1.1为什么使用NoSQL ​ NoSQL数据库相较于传统关系型数据库具有灵活性、可扩展性和高性能等优势&#xff0c;适合处理非结构化和半结构化数据&#xff0c…

服务运营|摘要:INFORMS 近期收益管理(Revenue Management )相关文章

编者按&#xff1a; 本期涵盖了INFORMS与收益管理相关的文章及其基本信息。 Title: Online Learning for Constrained Assortment Optimization Under Markov Chain Choice Model 基于马尔可夫链选择模型的约束下选品优化的在线学习 Link: https://pubsonline.informs.org/do…

召唤生命,阻止轻生——《生命门外》

本书的目的&#xff0c;就是阻止自杀&#xff01;拉回那些深陷在这样的思维当中正在挣扎犹豫的人&#xff0c;提醒他们珍爱生命&#xff0c;让更多的人&#xff0c;尤其是年轻人从执迷不悟的犹豫徘徊中幡然醒悟&#xff0c;回归正常的生活。 网络上抱孩子跳桥轻生的母亲&#…

Linux中gdb调试器的使用

Linux调试器&#xff1a;gdb gdb简介基本使用和常见的指令断点相关运行相关命令 gdb简介 我们都知道一个程序一般有两个版本分别是debug&#xff0c;和release版本&#xff0c;后者就是发布给用户的版本&#xff0c;而前者就是我们程序员用来调试用的版本。 他们有什么区别呢&…

Docker搭建Mysql主从复制,最新,最详细

Docker搭建Mysql主从复制&#xff0c;最新&#xff0c;最详细 这次搭建Mysql主从复制的时候&#xff0c;遇到不少问题&#xff0c;所以本次重新记录一下&#xff0c;使用Docker搭建一主三从的Mysql 一、Docker-Compose创建4个Mysql容器 1.1 创建对应的映射文件夹和对应的配置…

GitLab的安装步骤与代码拉取上传操作

一、GitLab的安装 详情见如下博客链接&#xff1a;gitlab安装 二、GitLab配置ssh key &#xff08;1&#xff09;打开Git Bash终端生成SSH和添加步骤 1、全局配置git用户名 git config --global user.name "xxx"注意&#xff1a;xxx为你自己gitlab的名字 2、全局…

JavaScript递归菜单栏

HTML就一个div大框架 <div class"treemenu"></div> 重中之重的JavaScript部分他来啦&#xff01; 注释也很清楚哟家人们&#xff01; let data; let arr []; let cons;let xhr new XMLHttpRequest(); // 设置请求方式和请求地址 xhr.open(get, ./js…

Linux上如何分析进程内存分配,优化进程内存占用大小

云计算场景下,服务器上内存宝贵,只有尽可能让服务器上服务进程占用更少的内存,方才可以提供更多的内存给虚拟机,卖给云客户。 虚拟化三大件:libvirt、qemu、kvm内存开销不小,可以优化占用更少的内存。如何找到进程内存开销的地方直观重要,以qemu为例说明。 一、查看进…

别让不专业的HR逼走你的人才!人力资源管理应该遵循哪些原则?

优秀的HR能够带领整个人力资源部门为企业招揽人才、培养人才和留住人才&#xff0c;促使人才为企业的业务增长提供支持。而不专业的HR&#xff0c;不仅无法做到这些&#xff0c;还会把企业原有的人才逼走&#xff0c;因为不合适的人力管理也是导致人才离职的原因。所以&#xf…

【C++】前缀和算法专题

目录 介绍 【模版】一维前缀和 算法思路&#xff1a; 代码实现 【模版】二维前缀和 算法思路 代码实现 寻找数组中心的下标 算法思路 代码实现 总结 除自身以外数组的乘积 算法思路 代码实现 和为K的子数组 算法思路 代码实现 和可被整除的K的子数组 算法思…

C++ 操作Git仓库

代码 #include "common.h" #include "args.c" #include "common.c"enum index_mode {INDEX_NONE,INDEX_ADD };struct index_options {int dry_run;int verbose;git_repository* repo;enum index_mode mode;int add_update; };/* Forward declar…

Python零基础详细入门教程

Python零基础详细入门教程可以从以下几个方面展开&#xff0c;帮助初学者系统地学习Python编程&#xff1a; 一、Python基础入门 1. Python简介 Python的由来与发展&#xff1a;Python是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和强大的功能而受到开发者的喜爱…

2024第二十届中国国际粮油产品及设备技术展示交易会

2024第二十届中国国际粮油产品及设备技术展示交易会 时间&#xff1a;2024年11月15-17日 地点&#xff1a; 南昌绿地国际博览中心 展会介绍&#xff1a; 随着国家逐年加大对农业的投入&#xff0c;调整农业产业结构&#xff0c;提高农产品附加值&#xff0c;促进农民增收。…