LeetCode刷题--- 乘积最大子数组

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

 http://t.csdnimg.cn/yUl2I

【C++】    

​​​​​​http://t.csdnimg.cn/6AbpV

数据结构与算法

 ​​​http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


乘积最大子数组

题目链接:乘积最大子数组

题目

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

解法

算法原理讲解

这道题与「最大子数组和」非常相似,我们可以效仿着定义⼀下状态表示以及状态转移:
  1. dp[i] 表示i 为结尾的所有子数组的最⼤乘积。
  2. dp[i] = max(nums[i], dp[i - 1] * nums[i])

但是,由于正负号的存在,我们很容易就可以得到,这样求 dp[i] 的值是不正确的。因为 dp[i - 1] 的信息并不能让我们得到 dp[i] 的正确值。⽐如数组 [-2, 5, -2] ,⽤上述状态转移得到的 dp数组为 [-2, 5, -2] ,最⼤乘积为 5 。但是实际上的最大乘积应该是所有数相乘,结果为 20

所以,我们应该引入一个「最小子数组乘积」。


我们这题使用动态规划,我们做这类题目可以分为以下五个步骤

  1. 状态显示
  2. 状态转移方程
  3. 初始化(防止填表时不越界)
  4. 填表顺序
  5. 返回值
  • 状态显示

f[i] 表示:以 i 结尾的所有⼦数组的最大乘积。

g[i] 表示:以 i 结尾的所有⼦数组的最小乘积。

  • 状态转移方程
对于 f[i] ,也就是「以 i 为结尾的所有⼦数组的最⼤乘积」,对于所有子数组,可以分为下面三种形式:
  1. 子数组的⻓度为 1 ,也就是 nums[i]
  2. 子数组的⻓度⼤于 1 ,但 nums[i] > 0 ,此时需要的是 i - 1 为结尾的所有⼦数组的最⼤乘积 f[i - 1] ,再乘上 nums[i] ,也就是 nums[i] * f[i - 1]
  3. 子数组的⻓度⼤于 1 ,但 nums[i] < 0 ,此时需要的是 i - 1 为结尾的所有⼦数组 的最⼩乘积 g[i - 1] ,再乘上 nums[i] ,也就是 nums[i] * g[i - 1]
(如果 nums[i] = 0 ,所有⼦数组的乘积均为 0 ,三种情况其实都包含了)
综上所述, f[i] = max(nums[i], max(nums[i] * f[i - 1], nums[i] * g[i - 1]) )
同理可得
  1. f[i] = max(nums[i], max(nums[i] * f[i - 1], nums[i] * g[i - 1]) )。
  2. g[i] = min(nums[i], min(nums[i] * f[i - 1], nums[i] * g[i - 1])) 。
  • 初始化(防止填表时不越界)
最前⾯加上⼀个格⼦,并且让 f[0] = g[0] = 1 即可。
  • 填表顺序

根据状态转移方程可以得出两个表都是从左到右。

  • 返回值

返回 f[i] 中的最大值。

以上思路讲解完成,可以自己做一做了。


代码实现

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();int ret = INT_MIN;// 状态显示vector<int> f(n + 1);		// 以 i 为结尾,乘积最大子数组vector<int> g(n + 1);		// 以 i 为结尾,乘积最小子数组// 初始化f[0] = 1;g[0] = 1;// 填表for (int i = 1; i <= n; i++){int x = nums[i - 1];int y = nums[i - 1] * f[i - 1];int z = nums[i - 1] * g[i - 1];f[i] = max(x, max(y, z));g[i] = min(x, min(y, z));ret = max(ret, f[i]);}return ret;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eureka 入门教程

Eureka 介绍 1. 注册中心概述 什么是注册中心&#xff1f; 给客户端提供可供调用的服务列表&#xff0c;客户端在进行远程调用&#xff08;RPC&#xff09;时&#xff0c;根据服务列表选择服务提供方的服务地址进行服务调用 注册中心的核心功能 注册&#xff1a;服务提供者上…

操作系统—xv6内核环境配置

文章目录 xv6内核环境配置1.开发环境的准备(1).如果日常用Linux(2).Windows的回合#1.两个常见方法#2.wsl的一点安装细节#3.记得升级成wsl-2 (3).如果你是macOS#1.一些起因#2.最乐的一集#3.Homebrew的配置#4.mac用户的特权 2.先换apt源3.安装xv6的依赖4.克隆RISC-V GNU 编译器工…

docker中hyperf项目配置虚拟域名

在学习hyperf框架时遇到一些问题&#xff0c;这里是直接用了docker环境 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version…

pytorch 图像数据集管理

目录 1.数据集的管理说明 2.数据集Dataset类说明 3.图像分类常用的类 ImageFolder 1.数据集的管理说明 pytorch使用Dataset来管理训练和测试数据集&#xff0c;前文说过 torchvision.datasets.MNIST 这些 torchvision.datasets里面的数据集都是继承Dataset而来&#xff0c…

【LeetCode:108. 将有序数组转换为二叉搜索树 + 二叉树+递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Node.js+Express后端,自定义接口

6分钟学会Express 后端 API 开发 Node.js 2020最新版_哔哩哔哩_bilibili 要使用Node.js和Express搭建一个简单的后台服务器,用于接收带有token的请求头,你可以按照以下步骤进行操作: 首先,确保你已经安装了Node.js和npm(Node.js的包管理器)。 创建一个新的项目文件夹并…

VUE3:统计分析页面布局+自适应页面参考

一、布局 <template><div class"container1"><div class"form white"><el-form :inline"true" :rules"rules" :model"queryParams" label-width"80px" ref"querParmRef"><e…

apache 模式、优化、功能 与 nginx优化、应用

一、I/O模型——Input/Output模型 1.同步/异步 A程序需要调用B程序的某一个功能&#xff0c;A发送一个请求需要B完成一个任务 同步&#xff1a;B不会主动去通知A是否完成需要A自己去问 异步&#xff1a;B会主动通知A是否完成 2.阻塞/非阻塞 A发送一个请求需要B完成一个任务 …

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

简单1步搞定 NET Framework 3.5 ,离线下载

https://download.csdn.net/download/m0_72735063/88889747?spm1001.2014.3001.5503

Redisson限流算法

引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.12.3</version> </dependency>建议版本使用3.15.5以上 使用 这边写了一个demo示例&#xff0c;定…

给MATLAB安装runtime插件

给MATLAB安装runtime插件&#xff0c;将MATLAB程序打包成exe文件方法 1.查看已安装的MATLAB是否有runtime插件。操作:在command窗口直接输入mcrinstaller。 如果如图上所示&#xff0c;那就是没有。(2019版本以后包括2019一般均没有) 2.下载MATLAB对应子版本的runtime。(很多…