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

【动态规划】【数论】【区间合并】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++**实现。

相关文章:

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

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 数论 区间合并 LeetCode3041. 修改数组后最大化数组中的连续元素数目 给你一个下标从 0 开始只包含 正 整数的数组 nums 。 一开始&#xff0c;你可以将数组中 任意数量 元素增加 至多 1 。 修改后&#xff0c;你可以从…...

字节后端实习 一面凉经

心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊&#xff0c;求捞&#xff5e;&#xff08;boss小公司也不理我&#xff09; 很纠结要不要干脆直接面暑期实习&#xff0c;又怕因为没有后端实习经历&#xff0c;面不到大厂实习。死锁了...

倒计时37天

复习1001. 马走日问题: 1.P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //日常碎碎念&#xff1a;谁懂啊&#xff0c;dev突然不能用了&#xff0c;也不知道是哪里出了问题下了五六次都不能用&#xff0c;&#xff0c;&#xff0c;找远程安…...

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…...

测试入门篇

测试: 这里写目录标题 测试:基础概念:BUG:创建一个合理的bug:bug 的级别:跟开发争执如何解决: 测试用例:编写测试用例的万能公式:案例: 登录功能的测试:设计测试用例的方法: 进阶篇(主要介绍测试方法):自动化测试:自动化测试的分类:selenium( web 自动化测试工具 )环境部署:什么…...

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…...

[数据结构]OJ用队列实现栈

225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构&#xff0c…...

「优选算法刷题」:最长回文子串

一、题目 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba"…...

Java项目:41 springboot大学生入学审核系统的设计与实现010

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本大学生入学审核系统管理员和学生。 管理员功能有个人中心&#xff0c;学生管理&#xff0c;学籍信息管理&#xff0c;入学办理管理等。 学生功能有…...

【数据结构与算法】常见排序算法(Sorting Algorithm)

文章目录 相关概念1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 直接插入排序&#xff08;Insertion Sort&#xff09;3. 希尔排序&#xff08;Shell Sort&#xff09;4. 直接选择排序&#xff08;Selection Sort&#xff09;5. 堆排序&#xff08;Heap Sort&#xff09;…...

Unity3D学习之XLua实践——背包系统

文章目录 1 前言2 新建工程导入必要资源2.1 AB包设置2.2 C# 脚本2.3 VSCode 的环境搭建 3 面板拼凑3.1 主面板拼凑3.2 背包面板拼凑3.3 格子复合组件拼凑3.4 常用类别名准备3.5 数据准备3.5.1 图集准备3.5.2 json3.5.3 打AB包 4 Lua读取json表及准备玩家数据5 主面板逻辑6 背包…...

前端技术研究越深入,越觉得技术不是决定录用唯一条件。

一、拒绝抬杠 我说技能不是唯一条件&#xff0c;不是说技能不重要&#xff0c;招聘前端条件是1X,其中1是技能&#xff0c;X是其他条件。 如果X条件很优秀&#xff0c;1这个条件可以降格为0.8、0.5&#xff0c;甚至更低。 有人就抬杠&#xff0c;那为啥不招聘清洁工来干前端&…...

vue组件的重新渲染的问题

目录 1.方式1 2.方式2 1.方式1 修改组件上的key属性 Vue是通过diffing算法比较虚拟DOM和真实DOM&#xff0c;来判断新旧 DOM 的变化。key是虚拟DOM对象的标识&#xff0c;在更新显示时key表示着DOM的唯一性。 DOM是否变化的核心是通过判断新旧DOM的key值是否变化&#xff0c…...

opengl 学习(二)-----你好,三角形

你好&#xff0c;三角形 分类demo效果解析 分类 opengl c demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using namespace std;/** * 在学习此节之前&#xff0c;建议将这…...

mongodb4.2升级到5.0版本,升级到6.0版本, 升级到7.0版本案例

今天一客户想把自己当前使用的mongodb数据库4.2版本升级到7.0版本。难道mongodb能直接跳跃升级吗? 经过几经查找资料&#xff0c;貌似真不行呀。确定升级流程如下: 还得从mongo4.2升级到5.0。其次再从5.0升级到6.0。最后再从6.0升级到7.0。 开始升级之前将数据进行备份 这一步…...

CPU处理器模式与异常

ARM架构中的Exception Level&#xff08;EL&#xff09; 在ARM架构中&#xff0c;Exception Level&#xff08;EL&#xff09;是一个关键概念&#xff0c;它表示了处理器当前处理异常或中断的层次。ARMv8-A架构定义了四个Exception Levels&#xff1a;EL0、EL1、EL2和EL3&…...

Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<int>(text2.size()1,0));int res 0;for(int i 1; i < text1.size(); i){for(int j 1; j <…...

ant-desgin charts双轴图DualAxes,柱状图无法立即显示,并且只有在调整页面大小(放大或缩小)后才开始显示

摘要 双轴图表中&#xff0c;柱状图无法立即显示&#xff0c;并且只有在调整页面大小&#xff08;放大或缩小&#xff09;后才开始显示 官方示例代码 在直接复制&#xff0c;替换为个人数据时&#xff0c;出现柱状图无法显示问题 const config {data: [data, data],xFiel…...

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

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

成都正信:亲戚借了钱一直不还怎么委婉的说

在中国传统文化中&#xff0c;亲情关系往往被视为最为重要和敏感的部分。当亲戚间发生借贷时&#xff0c;若出现拖欠不还的情形&#xff0c;处理起来尤为棘手。面对这样的尴尬局面&#xff0c;采取委婉而有效的沟通方式至关重要。 张华最近就遇到了这样的困扰。他的表弟去年因急…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...