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

动态规划之连续乘积最大子数组 连续和最大子数组

一. 连续和最大子数组

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:

输入:nums = [1]
输出:1
示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

1.1 怎么想到使用动态规划?

当然是题目给的建议。

  1. 题目中讲,求最大和。
  2. 题目中讲,返回最大和。

我们要做的是求一个目标值(通常最大,最小), 不要求过程,只要结果。 对于这种题目,我们通常使用动态规划

1.2 动态规划第一步该做什么?

首先明确几个关键点。

  1. 最大连续子数组,与子序列区别开,即数组下标连续。
  2. 和最大,针对每个【i】怎么计算子问题。

当然就是找到状态转移方程啊!

f ( i ) = { f ( i − 1 ) + i ( i < = f ( i − 1 ) + i ) i ( i > f ( i − 1 ) + i ) f(i) =\left\{ \begin{aligned} f(i-1) + i (i <= f(i-1) + i) \\ i (i > f(i-1) + i) \end{aligned} \right. f(i)={f(i1)+i(i<=f(i1)+i)i(i>f(i1)+i)

求和的状态转移方程很简单。当我们有了 i - 1位置的结果,去求 i位置的连续子数组和,当然就是用 f ( i − 1 ) + i 和 i f(i-1) + i 和 i f(i1)+ii 比较一下,拿最大的呀

仔细想想,这不对吧?
在这里插入图片描述
这有什么不对的呢?

在这里插入图片描述
明显,前4个最大连续和是 1 + 2 + 3 = 6。

所以错在哪里了呢?或者说,我们怎么计算能得到6呢?

很简单,return 2 > 6 ? 2 : 6 不就行了吗

我们的函数计算的值是以当前坐标为结尾的数组的最大子数组。
动态规划的子问题和整体问题求的目标是一致的,只有状态再更迭,此处的状态就是下标index。

计算得到函数要与旧的最大值进行比较取最大。

fun maxSubArray(nums []int) int {pre, res := 0, nums[0]for _, v := range nums {pre = max(pre + v, v)res = max(res, pre)}return res
}

二. 连续乘积最大子数组

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

测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。

示例 1:

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

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

2.1 这个题目使用什么方法?

  1. 乘积最大。
  2. 返回乘积。
  3. 连续子数组。

这俩题目,是不是一样的。先想一想差别。

求最大值,返回结果, 那使用动态规划没什么问题。

2.2 直接写代码

fun maxSubArray(nums []int) int {pre, res := 1, nums[0]for _, v := range nums {pre = max(pre * v, v)res = max(res, pre)}return res
}

因为乘法,所以pre初始值改为1 。

会有问题吗?

在这里插入图片描述
明显的错误…

只是加法变乘法,原来的方案就行不通了。

问题就在于,乘法遇到负数,从最大变成了最小,-4 * 3 = -12

所以我们需要对这个负号进行一下特殊的处理。

2.3 状态该怎么变化呢?

如果遇到负数,我们希望使用一个最小的值与其做乘积运算,期望得到一个最大的值; 反之遇到正数,我们要用一个最大的值进行乘积运算。

所以,我们需要记两个值,分别是一个最大的preMax 和一个最小的preMin.

p r e M a x = f ( i ) m a x p r e M i n = f ( i ) m i n p r e M a x = M a x ( f ( i − 1 ) m a x ∗ n u m [ i ] , f ( i − 1 ) m i n ∗ n u m [ i ] , n u m [ I ] ) p r e M i n = M i n ( f ( i − 1 ) m i n ∗ n u m [ i ] , f ( i − 1 ) m a x ∗ n u m [ i ] , n u m [ I ] ) preMax = f(i)_{max} \\ preMin = f(i)_{min}\\ preMax = Max(f(i-1)_{max}*num[i], f(i-1)_{min} * num[i], num[I])\\ preMin= Min(f(i-1)_{min}*num[i], f(i-1)_{max} * num[i], num[I]) preMax=f(i)maxpreMin=f(i)minpreMax=Max(f(i1)maxnum[i],f(i1)minnum[i],num[I])preMin=Min(f(i1)minnum[i],f(i1)maxnum[i],num[I])

代码就比较简单了

func maxProduct(nums []int) int {preMax,preMin, res := 1,1, nums[0]for _,v := range nums {mn,mx := preMin,preMaxpreMax = max(mx * v, max(mn * v,v))preMin = min(mn * v, min(mx * v,v))res = max(preMax,res)}return res

为什么多了一行mn,mx := preMin,preMax
你可以去掉试试看~

20230902记录,今天先到这里。

相关文章:

动态规划之连续乘积最大子数组 连续和最大子数组

一. 连续和最大子数组 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,…...

keil在点击debug无法运行(全速运行)

1、今天发现我之前可以debug的程序&#xff0c;在板子上无法debug了&#xff0c;打断点完全没用 2、换了电脑&#xff0c;带板子过去也这样&#xff0c;之前可以运行的代码都debug不了 3、按照网上的方法&#xff0c;都不行&#xff0c;全速运行&#xff0c;单步执行都是灰色…...

go语言-协程

mOS结构体 每一种操作系统不同的线程信息 g给g0栈给g0协程内存中分配的地址&#xff0c;记录函数跳转信息&#xff0c; 单线程循环 0.x版本 1.0版本 多线程循环 操作系统并不知道Goroutine的存在 操作系统线程执行一个调度循环&#xff0c;顺序执行Goroutine 调度循环非常…...

如何伪造http头,让后端认为是本地访问

0x00 前言 这个知识点纯粹就是为了ctf准备的&#xff0c;很少有系统会出现这种情况。 0x01 正文 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过&#xff1a; host: 127.0.0.12.X-Forwarded-For X-Forwarded-For&#xff08;XFF&#xff09;是用来…...

视频剪辑音效处理软件有哪些?视频剪辑软件那个好用

音效是视频剪辑的重要部分&#xff0c;能起到画龙点睛的作用。在短视频平台中&#xff0c;一段出彩的音效能将原本平平无奇的视频变得生动有趣。那么&#xff0c;视频剪辑音效处理软件有哪些&#xff1f;本文会给大家介绍好用的音效处理软件&#xff0c;同时也会介绍视频剪辑音…...

搭建STM32F407的Freertos系统(基于STM32CubeMX)

本人长期开发Linux、Windows上应用软件&#xff0c;一直以来MCU开发有所接触&#xff0c;但较少&#xff08;最近项目需要&#xff0c;小公司么&#xff0c;都得会&#xff0c;被逼的&#xff09;&#xff0c;好在有STM32CubeMX这样工具&#xff0c;貌似就是我想要的工具。 本次…...

vite 配置自动补全文件的后缀名

vite 不建议自动补全&#xff0c;文件的后缀名的 const Home ()>import("/views/Home.vue");文件是必须要加上 .vue 的后缀名的 如果 想要像 webpack 一样的不用写&#xff0c; 可以在vite.config.js中配置如下就可以了...

基于Spring Boot的人才公寓管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的人才公寓管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…...

Python 编写函数

文章目录 条件语句循环语句自定义函数函数参数的传递类型函数的参数传入方法 lambda, map, filter, reduce 函数try-except 语句调试一些常用的内置函数 条件语句 编写程序时&#xff0c;经常用到一些条件或判断&#xff0c;需要用到 if 语句&#xff0c;它的字面意思是&#…...

C# Solidworks二次开发:创建距离配合以及移动组件API详解

今天要讲的文章是关于如何创建距离配合和移动组件的API详解。 &#xff08;1&#xff09;创建配合API&#xff0c;CreateMate() 这个API的解释是根据指定的特性数据对象来创建配合&#xff0c;也就可以理解为输入什么样的特征对象就可以创建出什么配合&#xff0c;这个API的输…...

Excel:通过Lookup函数提取指定文本关键词

函数公式&#xff1a;LOOKUP(9^9,FIND($G 2 : 2: 2:G 6 , C 2 ) , 6,C2), 6,C2),G 2 : 2: 2:G$6) 公式解释&#xff1a; lookup第一参数为9^9&#xff1a;代表的是一个极大值的数据&#xff0c;查询位置里面最接近这一个值的数据&#xff1b;lookup第二参数用find函数代替&am…...

sql:SQL优化知识点记录(六)

&#xff08;1&#xff09;索引优化1 查看一下有没有建立索引&#xff1a; 用到索引中的一个&#xff1a;type中的ref决定访问性能 用到索引中的两个&#xff1a;通过key_len的长度可以看出来&#xff0c;比第一个大一点。或者通过ref&#xff1a;中用到了两个常量const 用到了…...

C#搭建WebSocket服务实现通讯

在学习使用websocket之前我们先了解一下websocket&#xff1a; WebSocket是一种在单个TCP连接上进行全双工通信的通信协议。与HTTP协议不同&#xff0c;它允许服务器主动向客户端发送数据&#xff0c;而不需要客户端明确地请求。这使得WebSocket非常适合需要实时或持续通信的应…...

eclipse/STS(Spring Tool Suite)安装CDT环境(C/C++)

在线安装 help -> eclipse marketplace 可以发现&#xff0c;我所使用eclipse给我推荐安装的CDT是10.5版本 离线安装 下载离线安装包 下载地址&#xff1a;https://github.com/eclipse-cdt/cdt/blob/main/Downloads.md 可以看到利息安装包主要有如下四大类&#xff0c;…...

Python爬虫抓取经过JS加密的API数据的实现步骤

随着互联网的快速发展&#xff0c;越来越多的网站和应用程序提供了API接口&#xff0c;方便开发者获取数据。然而&#xff0c;为了保护数据的安全性和防止漏洞&#xff0c;一些API接口采用了JS加密技术这种加密技术使得数据在传输过程中更加安全&#xff0c;但也给爬虫开发带来…...

Nacos基础(2)——nacos的服务器和命名空间 springBoot整合nacos 多个nacos配置的情况

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误&#xff1a;缺少服务名称报错&#xff1a;9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…...

Win7设备和打印机里空白,0个对象,但是可以打印的处理办法

呉師傅 你是不是遇到过Win7系统打开设备和打印机的时候显示是空白的&#xff0c;0个设备的情况&#xff1f;要怎么操作才能解决这一问题呢&#xff0c;下面就分享一下如何处理这个问题的小方法大家可以尝试一下。 问题如下&#xff1a; 解决方法&#xff1a; 1、点击桌面左下…...

Python基础学习第六天:Python 数据类型

内置数据类型 在编程中&#xff0c;数据类型是一个重要的概念。 变量可以存储不同类型的数据&#xff0c;并且不同类型可以执行不同的操作。 在这些类别中&#xff0c;Python 默认拥有以下内置数据类型&#xff1a; 获取数据类型 您可以使用 type() 函数获取任何对象的数据…...

C++信息学奥赛1184:明明的随机数

#include <bits/stdc.h> using namespace std; int main() {int n; // 数组长度cin >> n; // 输入数组长度int arr[n]; // 定义整数数组&#xff0c;用于存储输入的整数// 输入数组元素for (int i 0; i < n; i){cin >> arr[i];}int e 0; // 计数器&…...

NoSQL技术——Redis

简单介绍 Redis是当下最流行的NoSQL数据库。在Redis中&#xff0c;数据的存储格式是以键值对的方式进行存储的。在键值对的存储形式中&#xff0c;值除了是常见的字符串&#xff0c;也可以是类似于Json对象的形式&#xff0c;或者是List&#xff0c;Map等数组格式&#xff0c;…...

纹理识别必备!5个高质量数据集下载与使用指南(附避坑技巧)

纹理识别实战指南&#xff1a;五大高价值数据集深度解析与应用技巧 纹理识别作为计算机视觉领域的重要分支&#xff0c;在工业质检、自动驾驶、医疗影像等场景中发挥着关键作用。但许多开发者在数据集获取和预处理阶段就会遇到各种"暗坑"——从下载链接失效到标注格式…...

别再只调API了!用Langchain4j的RAG功能,5分钟给你的Java应用加上专属知识库

用Langchain4j的RAG功能为Java应用快速构建智能知识库 在当今信息爆炸的时代&#xff0c;企业内部的文档资料往往分散在各个角落&#xff0c;员工需要花费大量时间查找相关信息。传统的全文检索方式虽然能解决部分问题&#xff0c;但当用户用自然语言提问时&#xff0c;往往难…...

DFR0554双芯片显示模块驱动解析:PCA9633与AIP31068协同控制

1. DFR0554 显示模块驱动深度解析&#xff1a;基于 PCA9633 与 AIP31068 的双芯片协同架构 DFR0554 是 DFRobot 推出的一款集成化智能显示模块&#xff0c;其核心并非单一显示控制器&#xff0c;而是由两颗功能互补的专用 IC 协同构成&#xff1a; PCA9633 LED 驱动器 与 A…...

DeOldify图像上色服务Node.js调用实战:构建自动化批处理工具

DeOldify图像上色服务Node.js调用实战&#xff1a;构建自动化批处理工具 你是不是也遇到过这样的情况&#xff1f;手头有一大堆珍贵的老照片&#xff0c;都是黑白的&#xff0c;想给它们上色却无从下手。一张张手动处理&#xff1f;那得花多少时间啊。或者&#xff0c;你所在的…...

3个超实用方法:115proxy-for-Kodi插件实现云端视频流畅播放完全指南

3个超实用方法&#xff1a;115proxy-for-Kodi插件实现云端视频流畅播放完全指南 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 你是否曾因115网盘中的高清视频无法在Kodi上流畅播放而困扰…...

Janus-Pro-7B在SolidWorks设计中的应用:工程问题智能答疑

Janus-Pro-7B在SolidWorks设计中的应用&#xff1a;工程问题智能答疑 1. 引言 想象一下这个场景&#xff1a;你正在用SolidWorks赶一个复杂的装配体设计&#xff0c;突然卡在了一个配合关系上&#xff0c;或者对某个特征的生成顺序拿不准。这时候&#xff0c;你是去翻几百页的…...

ANSYS接触分析实战:从法兰连接案例看MPC绑定与标准接触设置技巧

ANSYS接触分析实战&#xff1a;法兰连接中的MPC绑定与标准接触配置全解析 在机械工程领域&#xff0c;法兰连接作为管道系统中最常见的连接方式之一&#xff0c;其可靠性直接影响整个系统的安全运行。传统设计方法往往依赖经验公式和安全系数&#xff0c;难以准确预测复杂工况下…...

为什么92%的Java边缘项目因Classloader泄漏失败?揭秘3层隔离沙箱设计与实时热替换机制

第一章&#xff1a;Java边缘计算轻量级运行时开发概览边缘计算场景对运行时环境提出严苛要求&#xff1a;低内存占用&#xff08;通常 ≤ 64MB&#xff09;、毫秒级冷启动、有限依赖、原生支持资源约束设备&#xff08;如 ARM64 IoT 网关、工业 PLC&#xff09;。Java 生态传统…...

Java 25正式支持ZGC 2.0仅剩72小时!你还没掌握这8个颠覆性调优参数?

第一章&#xff1a;ZGC 2.0在Java 25中的里程碑意义与演进全景ZGC 2.0 是 Java 25 中最具突破性的垃圾回收器升级&#xff0c;标志着低延迟 GC 技术从“亚毫秒停顿”正式迈向“纳秒级停顿保障”的新纪元。它不再仅依赖染色指针&#xff08;Colored Pointers&#xff09;和读屏障…...

WinForm实战:OxyPlot图表控件鼠标悬停显示坐标值(附完整代码)

WinForm实战&#xff1a;OxyPlot图表控件鼠标悬停显示坐标值&#xff08;附完整代码&#xff09; 在数据可视化应用中&#xff0c;实时交互功能往往能显著提升用户体验。当开发者需要在WinForm平台快速实现专业级图表时&#xff0c;OxyPlot.WindowsForms.Plot控件凭借其轻量级和…...