【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目

作者推荐

视频算法专题

本文涉及知识点

动态规划汇总
数论 区间合并

LeetCode3041. 修改数组后最大化数组中的连续元素数目

给你一个下标从 0 开始只包含 正 整数的数组 nums 。
一开始,你可以将数组中 任意数量 元素增加 至多 1 。
修改后,你可以从最终数组中选择 一个或者更多 元素,并确保这些元素升序排序后是 连续 的。比方说,[3, 4, 5] 是连续的,但是 [3, 4, 6] 和 [1, 1, 2, 3] 不是连续的。
请你返回 最多 可以选出的元素数目。
示例 1:
输入:nums = [2,1,5,1,1]
输出:3
解释:我们将下标 0 和 3 处的元素增加 1 ,得到结果数组 nums = [3,1,5,2,1] 。
我们选择元素 [3,1,5,2,1] 并将它们排序得到 [1,2,3] ,是连续元素。
最多可以得到 3 个连续元素。
示例 2:
输入:nums = [1,4,7,10]
输出:1
解释:我们可以选择的最多元素数目是 1 。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 106

数论

先排序。
合并方式一:如果[left,r]中的数至少出现1次,则可以通过将所有数+1,从[left,r]转化成[left+1,r+1]。
合并方式二:如果[left,r]中的数至少出现1次,且至少一个数x出现两次。则可以将[left,r]转化成[left,r+1]。x → \rightarrow x+1,x+1 → \rightarrow x+2 ⋯ \cdots r → \rightarrow r+1。 如: {1,1,2,3} → \rightarrow {1,2,3,4}
如果 [l1,r1] 和[l2,r2] 是合法区间,r1+2= l2
方式一合并后,变成[l1+1,r2] ,由于缺少l1,合并后无法合并更小的区间。
方式二合并后,变成[l1,r2],可以继续合并更小的区间。
合并后的重复数字以[l2,r2]为准,[l1,r1]无论有多少个数字多不能变成r1+2,所以不会影响新区间。
我们枚举方式二的开始,如果 [l1,r1] 和[l2,r2] 能通过方式二合并,则无需枚举[l2,r2]。

代码

核心代码


template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}#define MacEnumMask(mask,maskMax) for (int mask = maskMax; mask; mask = (mask - 1) & maskMax) class Solution {
public:int maxSelectedElements(vector<int>& nums) {sort(nums.begin(), nums.end());vector<tuple<int, int, bool>> vLRTow;int left = 0;bool bRepeat = false;for (int i = 1; i < nums.size(); i++){if (nums[i] == nums[i - 1]){bRepeat = true;}else if (nums[i] != nums[i - 1] + 1){vLRTow.emplace_back(nums[left], nums[i - 1], bRepeat);left = i;bRepeat = false;}}vLRTow.emplace_back(nums[left], nums.back(), bRepeat);std::unordered_map<int, int> mEndToLen;for (const auto& [left, r, tmp] : vLRTow){mEndToLen[r] = r - left + 1;}vector<tuple<int, int, bool>> vLRTow2;for (int i = 0; i  < vLRTow.size(); ){		vLRTow2.emplace_back(vLRTow[i]);i++;for ( ; i < vLRTow.size(); i ++){if (get<2>(vLRTow2.back()) && (get<1>(vLRTow2.back()) + 2 == get<0>(vLRTow[i]))){get<2>(vLRTow2.back()) = get<2>(vLRTow[i]);get<1>(vLRTow2.back()) = get<1>(vLRTow[i]);}else{break;}}			}		int iRet = 0;for (int i = 0 ; i < vLRTow2.size();i++){const auto& [left, r, bReapt] = vLRTow2[i];int pre = mEndToLen.count(left-2 )? mEndToLen[left-2] :0;MaxSelf(&iRet, pre + r - left + 1 + bReapt);}return iRet;}
};

测试用例

int main()
{vector<int> nums;{Solution sln;nums = { 16,1,6,14,5,10,16,3,3,7,12,18,6,11,10,10,9,16 };auto res = sln.maxSelectedElements(nums);Assert(13, res);}{Solution sln;nums = { 9, 8, 8, 5, 15, 9, 12, 5, 1, 3, 7, 18, 10 };auto res = sln.maxSelectedElements(nums);Assert(9, res);}{Solution sln;nums = { 8,13,18,10,16,19,11,17,15,18,9,12,15,8,9,14,7 };auto res = sln.maxSelectedElements(nums);Assert(14, res);}{Solution sln;nums = { 12, 11, 8, 7, 2, 10, 18, 12 };auto res = sln.maxSelectedElements(nums);Assert(6, res);}{Solution sln;nums = { 8,10,6,12,9,12,2,3,13,19,11,18,10,16 };auto res = sln.maxSelectedElements(nums);Assert(8, res);}{Solution sln;nums = { 2,1,4,1,1 };auto res = sln.maxSelectedElements(nums);Assert(4, res);}{Solution sln;nums = { 2,1,5,1,1 };auto res = sln.maxSelectedElements(nums);Assert(3, res);}	
}

优化代码:简洁


template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}#define MacEnumMask(mask,maskMax) for (int mask = maskMax; mask; mask = (mask - 1) & maskMax) class Solution {
public:int maxSelectedElements(vector<int>& nums) {sort(nums.begin(), nums.end());vector<tuple<int, int, bool>> vLRTow;int left = 0;bool bRepeat = false;for (int i = 1; i < nums.size(); i++){if (nums[i] == nums[i - 1]){bRepeat = true;}else if (nums[i] != nums[i - 1] + 1){vLRTow.emplace_back(nums[left], nums[i - 1], bRepeat);left = i;bRepeat = false;}}vLRTow.emplace_back(nums[left], nums.back(), bRepeat);int iRet = 0;for (int i = 0; i < vLRTow.size(); ){	int j = i + 1;int right = get<1>(vLRTow[i]) + get<2>(vLRTow[i]);for (; j < vLRTow.size(); j++){if (get<2>(vLRTow[j-1]) && (get<1>(vLRTow[j - 1]) + 2 == get<0>(vLRTow[j]))){right = get<1>(vLRTow[j]) + get<2>(vLRTow[j]);}else{break;}}			int pre = ((i > 0) && (get<1>(vLRTow[i - 1]) + 2 == get<0>(vLRTow[i]))) ? (get<1>(vLRTow[i - 1]) - get<0>(vLRTow[i - 1]) + 1) : 0;MaxSelf(&iRet, right - get<0>(vLRTow[i])+1 + pre );i = j;}return iRet;}
};

动态规划

动态规划的状态

dp[x]表示以x结尾的最长连续数量。

动态规划的初始值

无,或者或全部为0。

动态规划的状态方程

{ d p [ x + 1 ] = m a x ( d p [ x + 1 ] , d p [ x ] + 1 ) x 加一 d p [ x ] = m a x ( d p [ x ] , d p [ x − 1 ] + 1 ) x 不变 \begin{cases} dp[x+1] = max(dp[x+1],dp[x]+1) & x加一 \\ dp[x] = max(dp[x],dp[x-1]+1) & x不变\\ \end{cases} {dp[x+1]=max(dp[x+1],dp[x]+1)dp[x]=max(dp[x],dp[x1]+1)x加一x不变

动态规划的填表顺序

x从小到大。先处理x+1,再处理x。否则{1}的结果是dp[1]=1,dp[2]=2。

代码

template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}class Solution {
public:int maxSelectedElements(vector<int>& nums) {sort(nums.begin(), nums.end());unordered_map<int, int> dp;for (const auto& n : nums){MaxSelf(&dp[n + 1], dp[n] + 1);MaxSelf(&dp[n ], dp[n - 1] + 1);}int iRet = 0;for (const auto& [tmp, len] : dp){MaxSelf(&iRet, len);}return iRet;}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Spring Boot 3核心技术与最佳实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 highlight: a11y-dark 引言 Spring Boot作为…

企业财务分析该怎么做?重点分析哪些财务指标?

在企业经营管理的过程中&#xff0c;财务分析是评估当前企业或特定部门财务状况和绩效的过程&#xff0c;这一过程通常涉及对财务报表&#xff08;如资产负债表、利润表和现金流量表&#xff09;进行定量和定性的评估&#xff0c;以便为盈利能力、偿债能力、现金流动性和资金稳…

解决 RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Half‘

解决 RuntimeError: “LayerNormKernelImpl” not implemented for ‘Half’。 错误类似如下&#xff1a; Traceback (most recent call last): File “cli_demo.py”, line 21, in for results in webglm.stream_query(question): File “/root/WebGLM/model/modeling_webgl…

<C++>【继承篇】

​ ✨前言✨ &#x1f393;作者&#xff1a;【 教主 】 &#x1f4dc;文章推荐&#xff1a; ☕博主水平有限&#xff0c;如有错误&#xff0c;恳请斧正。 &#x1f4cc;机会总是留给有准备的人&#xff0c;越努力&#xff0c;越幸运&#xff01; &#x1f4a6;导航助手&#x1…

Vue+SpringBoot打造校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

入门版式设计:设计小白的必备知识!

你曾经被一本华丽的杂志、一张引人注目的海报或一个优雅的网站设计所吸引吗&#xff1f;这些都是版式设计的魅力所在。作为一个设计小白&#xff0c;我们可能不熟悉版式设计&#xff0c;但事实上&#xff0c;它无处不在&#xff0c;深深影响着我们的生活。那么&#xff0c;什么…

Spring 整合mybatis

目录 1、梳理整合思路 2、整合实现 2.1 环境搭建 2.2 案例 1、梳理整合思路 将MyBatis的DataSource交给Spring IoC容器创建并管理&#xff0c;使用第三方数据库连接池(Druid&#xff0c;C3P0等)代替MyBatis内置的数据库连接池将MyBatis的SqlSessionFactory交给Spring IoC容…

大型网站架构演化总结

本文图解大型网站架构演化。 目录 1、单一应用服务阶段 2、应用与数据服务分离阶段 3、利用缓存提高性能阶段 4、应用服务集群阶段 5、数据库读写分离阶段 6、反向代理与CDN加速阶段 7、分布式数据库阶段 8、 NoSQL与搜索引擎阶段 9、业务拆分阶段 10、分布式服务阶…

Leetcode刷题(三十八)

旋转矩阵&#xff08;Medium&#xff09; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1&#xff1a;输入&#xff1a;mat…

openGauss数据库实战分享

一&#xff1a;openGauss 数据库简介 想必大家都了解华为这个企业&#xff0c;华为在手机、通信、汽车研发、操作系统研发等方面都有很大的成就&#xff0c;如果不是受到了制裁&#xff0c;估计华为现在能取得更好的成绩。华为这一品牌大家都知道&#xff0c;但是华为的 openGa…

PaddleOCR识别框架解读[06] DBNet 阈值图与概率图标签的生成

文章目录 概率图 probability map 标签阈值图 threshold map 标签DB: Real-time Scene Text Detection with Differentiable Binarization网络整体流程一. Label generationprobability map生成threshold map 生成二. Differentiable Binarization可微二值化2.1 传统二值化和DB…

前端面试练习24.3.7

目录 1.类型转换练习 2.数据之间运算 算术运算 比较运算 逻辑运算 3.动态执行JS&#xff08;类似eval方法&#xff09; 1.eval()方法 2.setTimeout 3.创建DOM节点进行添加 4.Function的最后一个参数当作函数体直接运行 4.promise工具函数练习 5.统计字符频率写法的发…

js的类等于什么操作产生的?

class 类定义提升 class如和产生的对象&#xff1f; 类定义 实际上&#xff0c;类是“特殊的函数”&#xff0c;就像你能够定义的函数表达式和函数声明一样&#xff0c;类语法有两个组成部分&#xff1a;类表达式和类声明。 提升 函数声明和类声明之间的一个重要区别在于&am…

基于springboot+vue的医疗挂号管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

vcruntime140.dll丢失的修复办法详细介绍以及详细步骤

当电脑丢失vcruntime140.dll文件时&#xff0c;电脑会出现关于vcruntime140.dll丢失的错误提示&#xff0c;vcruntime140.dll文件包含许多重要的函数和资源&#xff0c;若缺少或丢失该文件&#xff0c;可能会导致电脑出现异常状况。今天就来和大家说说如果电脑出现关于vcruntim…

获取别人店铺的所有商品API接口

使用淘宝淘口令接口的步骤通常包括&#xff1a; 注册成为淘宝开放平台的开发者&#xff1a;在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥&#xff1a;在您的开发者控制台中创建一个应用&#xff0c;并获取用于API调用的密钥&#xff0c;如Client ID和Clie…

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结&#xff1a;6.编程语言和操作系统7. 进程/任务&#xff08;Process/Task&#xff09;8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…

javaweb学习(day07-手动实现tomcat)

一、引入案例 1 小案例 引出对 Tomcat 底层实现思考 1.1 完成小案例 1.1.1 运行效果 1.2 maven简要介绍 我们准备使用 Maven 来 创建一个 WEB 项目 , 先 简单给小伙伴介绍一下 Maven 是 什 么 , 更加详细的使用&#xff0c;我们还会细讲 , 现在先使用一把 1.3 创…

vue中常用的指令和自定义指令

在Vue中&#xff0c;常用的指令有v-bind、v-on、v-for、v-if、v-show等。自定义指令可以通过Vue.directive()方法来创建。 下面是常用指令和自定义指令的代码示例&#xff1a; v-bind&#xff1a;用于动态绑定HTML属性 <div v-bind:class"{active: isActive}"&…

多个变量指向同一个数组

多个变量中的内存地址是一样的&#xff0c;都是指向当前的数组&#xff0c;存储当前数组对象的地址&#xff0c;因此修改是对当前数组的值进行修改 数组中存储的是null&#xff0c;那么他将不会指向任何数组对象 System.out.println(arr) 输出结果为null&#xff0c;里面没有…