动态规划6,最大数组和,环形子数组最大和,乘积最大子数组
最大子数组和
思路:
1.经验+题目要求
dp[i]表示:以 i 位置为结尾的所有子数组中的最大和
2.状态转移方程
按长度来划分,如果长度为1,那么dp[i] = nums[i];
如果长度大于1,那么当前位置的最大和就为 i-1 位置最大和 + 当前位置,dp[i] = dp[i-1] + nums[i];
然后每一次都要取他们两个中的最大值。
存在 dp[i-1] , 建表时候多建一格,dp[0]位置为0 就不影响后面的填表
4 .
从左往右填表。
class Solution {
public:int maxSubArray(vector<int>& nums) {int n = nums.size();vector<int> dp(n+1);int ret = INT_MIN;//为了不影响比较for(int i = 1 ; i<=n; i++){dp[i] = max(nums[i-1],dp[i-1]+nums[i-1]);ret = max(dp[i],ret);//找出dp表里面的最大值}return ret;}
};
环形子数组的最大和
思路:
区别于上一道题,这一题变成了环形,也就是多了两边的情况,而两边的情况很复杂,我们可不可以把两边问题换为两种上一道题思路的简单问题?
最大数组和只有两种情况,看 1 在里面的情况,这就跟上一道题一样
看 2 ,当最大数组和在两边的时候,我们可以求出最小数组和的情况,然后sum - min。
步骤及思路都跟上一题一样,无非变成了求一个最大和表和一个最小和表,然后比较max(最大和,sum-最小和);
但是对于返回值,有点变化:
对于[-2 , -3 , -1], 最大和为-1, 但是最小和为-2 + -3 + -1 ,和sum是一样的,这时候最小和就变为了错误的0;
所以对于返回值要处理, 最小和 == sum的时候,返回最大和,不然返回max(最大和,sum-最小和)。
class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();vector<int> f(n+1);//建表auto g = f;int ret1 = INT_MIN;//不影响比较int ret2 = INT_MAX;int num = 0;for(int i = 1; i<=n; i++){f[i] = max(nums[i-1],f[i-1]+nums[i-1]);ret1 = max(ret1,f[i]);g[i] = min(nums[i-1],g[i-1]+nums[i-1]);ret2 = min(ret2,g[i]);num+=nums[i-1]; //求nums和}return num == ret2 ? ret1 : max(ret1,num - ret2);}
};
乘积最大子数组
思路:
1.经验+题目要求
dp[i]表示:以 i 位置为结尾的所有子数组中的最大乘积
2.状态转移方程
按长度来划分,如果长度为1,那么dp[i] = nums[i];
如果长度大于1,那么当前位置的最大和就为 i-1 位置最大和 + 当前位置,dp[i] = dp[i-1] * nums[i];
但是因为有正负,前面可能还是乘积最大,后一个数为负数,一下就变成了乘积最小;
相反,前面乘积最小,后一个数为负数,一下就就变成了乘积最大。
所以也要建一个乘积最小表。
f 表是乘积最大表,g 表是乘积最小表,
对于 f 表来讲,如果长度为1,f[i] = nums[i];
如果长度大于1,但是下一个数大于0,那么f[i] = f[i-1] * nums[i];
如果长度大于1,但是下一个数小于0,那么f[i] = g[i-1] * nums[i];
比较这三者的最大值并填入 f 表即可。 g表同理。
为了不影响乘积之间的填表,初始化f[0] = g[0] = 1就可以。
4.从左往右,两个表一起填写。
class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n+1);auto g = f;int ret1 = INT_MIN;int ret2 = INT_MAX;f[0] = g[0] = 1;for(int i = 1; i<=n; i++){f[i] = max(nums[i-1],max(f[i-1]*nums[i-1], g[i-1]*nums[i-1]));ret1 = max(f[i],ret1);g[i] = min(nums[i-1],min(g[i-1]*nums[i-1], f[i-1]*nums[i-1]));ret2 = min(g[i],ret2);}return ret1;}
};
乘积为正数的最长子数组长度
思路:
1.经验+题目要求
dp[i]表示:以 i 位置为结尾的所有子数组中乘积为正数的最长长度。
2.状态转移方程
首先细分,当长度为1的时候,如果nums[i] > 0 ,则为1;
当长度为1的时候,如果nums[i] < 0 ,则为0;
当长度大于1的时候,如果nums[i] > 0 ,则为f[i-1] + 1;
当长度大于1的时候,如果nums[i] < 0 ,则为g[i-1] + 1;但是这个g[i-1] + 1真的对吗?当g[i-1] 为0的时候,也就是前面乘积为正数,乘完nums[i] 后长度就变成0了,但是g[i-1] + 1结果为1,明显是错误的,所以应该判断 g[i-1] == 0 ? 0 : g[i-1] + 1;
再次划分情况,对于nums[i] > 0 的情况,f[i-1] + 1最次也为1,占主导;
对于nums[i] < 0 的情况,g[i-1] == 0 ? 0 : g[i-1] + 1;最次也为0,占主导;
就可以总结为下面那两种占主导的情况。
g[i] 也是如此。
3.
因为题目问的是长度,初始化f[0] = g[0] = 0;
4.从左往右,两个表一起填写。
class Solution {
public:int getMaxLen(vector<int>& nums) {int n = nums.size();vector<int> f(n+1);auto g = f;int ret = INT_MIN;for(int i =1; i<=n; i++){if(nums[i-1] > 0){f[i] = f[i-1]+1;g[i] = g[i-1] == 0 ? 0 : g[i-1]+1;}else if(nums[i-1] < 0){f[i] = g[i-1] == 0 ? 0 : g[i-1]+1;g[i] = f[i-1]+1;}ret = max(ret,f[i]);}return ret;}
};
相关文章:

动态规划6,最大数组和,环形子数组最大和,乘积最大子数组
最大子数组和 思路: 1.经验题目要求 dp[i]表示:以 i 位置为结尾的所有子数组中的最大和 2.状态转移方程 按长度来划分,如果长度为1,那么dp[i] nums[i]; 如果长度大于1,那么当前位置的最大和就为 i-1 位置最大和 …...

js 清空数组的方法
1、直接赋值空数组 let array [1, 2, 3, 4, 5]; array []; 这种方法并不推荐,如下图所示: 虽然a数组确实变为了空数组,但这种方法只是修改了a的指向,把a指向一个新的空数组,然而[1,2,3,4,5]这个数组并没有被清除&a…...

QT中使用QProcess执行命令,实时获取数据,例如进度条
前言 因为之前写了一个接收和发送文件的脚本,然后又需要获取进度,同步到进度条中。 效果: 使用正则匹配,获取命令行命令中的以下数据,然后同步到进度条 源码demo: 非完整代码: #include <Q…...

绘图设计:用Draw.io绘制图形技巧大全(含统一建模语言UML模板)
一、常见UML模板 1.流程图 2.用例图 include是包含关系,extend是扩展关系 简而言之,include是子集指向父集;而extend是扩展用例指向基础用例(基础用例可以理解为系统核心功能,扩展用例是可选的,不是必须…...

被唤醒的“第二十条”深入人心
近来张艺谋执导的电影《第二十条》,因为它与正在召开中的全国两会所发布的《最高人民法院工作报告》联系相当紧密,加之可免费收看,网民便相互转告,于是此信息条目立即冲上了网络热搜榜,观者如潮。因为最高人民法院工作…...
PHPInfo()信息泄漏原理以及修复方法
漏洞名称:PHPInfo信息泄漏、phpinfo()函数信息泄漏 漏洞描述: phpinfo()函数返回的信息中包含了服务器的配置信息,包括: 1)PHP编译选项以及文件扩展名的相关信息; 2)php的版本信息 3&#…...

202441读书笔记|《笠翁对韵》—— 金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双
202441读书笔记|《笠翁对韵》——金菡萏,玉芙蓉,酒晕微酡琼杏颊,香尘浅印玉莲双 《作家榜名著:笠翁对韵》作者李渔,霍俊明。是所有词句都有注音的一本书,轻松学不认识的字,非常朗朗上口的对偶词…...
006-v-model原理
v-model原理 简介v-model应用在输入框上v-model应用在组件上 简介 由 属性绑定(v-bind:value“searchText”) 配合 input事件监听(v-on:input“searchText event.target.value”) 实现。 应用在组件上由 props: {value: xxx } ,this.$emit(‘input’, xxx ) 完成。…...

Ubuntu下使用DAPLink(OpenOCD)
目录 1. 下载OpenOCD源代码 2. 编译代码 2.1 运行bootstrap 2.2 安装关联库 2.3 运行./configure 2.4 运行make 2.5 运行sudo make install 3. 烧录程序 3.1 挂起MCU 3.2 写入镜像 3.3 校验镜像 通过OpenOCD实现,在Ubuntu18 64bit下验证。 1. 下载OpenOC…...

C# 中 Math.Round 数学函数
在 C# 中,Math.Round 是一个数学函数,用于对一个浮点数进行四舍五入操作。它接受一个浮点数作为输入,并返回一个最接近输入值的整数或指定小数位数的浮点数。 Math.Round 方法有多个重载,其中最常用的重载有以下两种形式…...

力扣---接雨水---单调队列
题目: 单调队列思想: 没有思路的小伙伴可以先把这个想清楚哦:力扣hot10---大根堆双端队列-CSDN博客 从上面的图就可以发现,如果柱子呈递减序列,那么不会接到雨水,只要有一个小凸起柱子,那么这个…...
微分学<4>——微分中值定理
索引 微分中值定理极值定义4.1 极大(小)值定理4.1 Fermat引理定理4.2 Rolle定理 Lagrange中值定理定理4.3 Lagrange中值定理定理4.4 Cauchy中值定理 导数对函数性质的刻画Jensen不等式 微分中值定理 极值 定义4.1 极大(小)值 若存在 x 0 x_{0} x0的邻域 U ( x 0 , δ ) U\…...

FPGA的时钟资源
目录 简介 Clock Region详解 MRCC和SRCC的区别 BUFGs 时钟资源总结 简介 7系列FPGA的时钟结构图: Clock Region:时钟区域,下图中有6个时钟区域,用不同的颜色加以区分出来 Clock Backbone:从名字也能看出来&#x…...
LeetCode27: 移除元素
题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…...
Python使用Beautiful Soup及解析html获取元素并提取内容值
Python使用Beautiful Soup及解析html获取元素并提取内容值 1. 包括解析获取标题2. 根据标签及id获取所有元素3. 根据标签及class获取所有元素4. 获取元素下的标签的值5. 获取元素下的parent及child的元素的值参考 1. 包括解析获取标题 2. 根据标签及id获取所有元素 3. 根据标…...
如何清除keep-alive缓存
在 Vue.js 中,使用 <keep-alive> 组件可以将组件保留在内存中,以避免重复渲染和销毁,从而提高性能。如果需要手动清除 <keep-alive> 组件的缓存,可以通过两种方法来实现: 通过 $destroy 方法销毁组件&…...

2024年新手视频剪辑软件推荐-6款视频剪辑软件测评
视频剪辑软件推荐 premiere premiere 直达地址:各大软件网站 说到底,还是得专业的来,虽然很多人觉得他是收费的,但是你懂的,想要免费总是会有办法的.别的不说,剪辑这块,我还是很认可这个软件,虽然我现在还是刚入门. 剪映 剪映 抖音官方推出的一款手机视频编辑剪辑应用,提供切割…...

无货源抖店可以做吗?那些月入上万是真的吗?分享我的成功秘籍
大家好,我是电商花花。 现在还是有人在不停的在问,抖音小店无货源还可以做吗?那些月入上万都是真的吗? 当然是真的,而且做抖音小店非常简单,前提是你真的完全掌握到核心玩法,且要有执行力。 …...

文献阅读:DEA-Net:基于细节增强卷积和内容引导注意的单图像去雾
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读:DEA-Net:基于细节增强卷积和内容引导注意的单图像去雾1、研究背景2、方法提出3、相关知识3.1、DEConv3.3、多重卷积的…...

2024想要赚点小钱真的很容易!帮你们找的10个搞钱第二职业
我们都希望在空闲时间里增加一些额外收入,并有机会找到自己热爱的事业,每天贝兼几十上百元是一个不错的开始,小钱也是钱, 搞钱的经验会积少成多。今天分享10个搞钱第二职业,2024想要赚点小钱真的很容易。 一.摆摊卖花 …...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...