【动态规划】【C++算法】801. 使序列递增的最小交换次数

作者推荐

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

本文涉及知识点

动态规划汇总
数组

LeetCode801使序列递增的最小交换次数

我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中,我们可以交换 nums1[i] 和 nums2[i]的元素。
例如,如果 nums1 = [1,2,3,8] , nums2 =[5,6,7,4] ,你可以交换 i = 3 处的元素,得到 nums1 =[1,2,3,4] 和 nums2 =[5,6,7,8] 。
返回 使 nums1 和 nums2 严格递增 所需操作的最小次数 。
数组 arr 严格递增 且 arr[0] < arr[1] < arr[2] < … < arr[arr.length - 1] 。
注意:
用例保证可以实现操作。
示例 1:
输入: nums1 = [1,3,5,4], nums2 = [1,2,3,7]
输出: 1
解释:
交换 A[3] 和 B[3] 后,两个数组如下:
A = [1, 3, 5, 7] , B = [1, 2, 3, 4]
两个数组均为严格递增的。
示例 2:
输入: nums1 = [0,3,5,8,9], nums2 = [2,1,4,6,9]
输出: 1
提示:
2 <= nums1.length <= 105
nums2.length == nums1.length
0 <= nums1[i], nums2[i] <= 2 * 105

动态规划

动态规划的状态

vPrevPre[0]前i个元素,最后一个元素没交换的最小交换次数。vPre[1] 最后一个元素交换的最小交换次数。
dp前i+1个元素的最小交换次数。
vPreNum{nums1[i-1],nums2[i-1]}

动态规划的转移方程

前一个元素有两种情况:交换 不交换
当前元素也有两种情况:交换 不交换
共4种情况:如果两个元素都大于前面的元素,则可以转移。

动态规划的填表顺序

下标从小到大枚举nums1和nums2,时间复杂度😮(n)

动态规划的初始状态

vector vPre = { 0,0 };
vector vPreNum = { -1,-1 };

动态规划的返回值

min(vPre[0], vPre[1]);

代码

核心代码

class Solution {
public:int minSwap(vector<int>& nums1, vector<int>& nums2) {vector<int> vPre = { 0,0 };	vector<int> vPreNum = { -1,-1 };for (int i = 0; i < nums1.size(); i++){vector<int> dp(2, nums1.size());for (int iPre = 0; iPre <= 1; iPre++){				//当前下标不交换if ((nums1[i] > vPreNum[iPre]) && (nums2[i] > vPreNum[(iPre + 1) % 2])){dp[0] = min(dp[0], vPre[iPre]);}//当前下标交换if ((nums2[i] > vPreNum[iPre]) && (nums1[i] > vPreNum[(iPre + 1) % 2])){dp[1] = min(dp[1], vPre[iPre]+1);}}vPre.swap(dp);vPreNum = { nums1[i],nums2[i] };}return min(vPre[0], vPre[1]);}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{vector<int> nums1,  nums2;{Solution sln;nums1 = { 0, 3, 5, 8, 9 }, nums2 = { 2, 1, 4, 6, 9 };auto res = sln.minSwap(nums1, nums2);Assert(1, res);}{Solution sln;nums1 = { 1, 3, 5, 4 }, nums2 = { 1, 2, 3, 7 };auto res = sln.minSwap(nums1, nums2);Assert(1, res);} }

小技巧

iPre取值0或1时 iPre ^ 1 可以代替(iPre + 1) % 2

2023年1月

class Solution {
public:
int minSwap(vector& nums1, vector& nums2) {
vector pre(2);
if (nums1[0] >= nums2[0])
{
pre[0] = 0;
}
else
{
pre[0] = 1;
}
if (nums2[0] >= nums1[0])
{
pre[1] = 0;
}
else
{
pre[1] = 1;
}
for (int i = 1; i < nums1.size(); i++)
{
vector dp(2, INT_MAX);
const int iMaxPre = max(nums1[i - 1], nums2[i - 1]);
if (nums1[i] >= nums2[i])
{
dp[0] = pre[0];
if (nums2[i] > iMaxPre)
{
dp[0] = min(dp[0], pre[1]);
}
}
else
{
dp[0] = 1 + pre[0];
if (nums1[i] > iMaxPre)
{
dp[0] = min(dp[0], pre[1]+1 );
}
}
if (nums2[i] >= nums1[i])
{
dp[1] = pre[1];
if (nums1[i] > iMaxPre)
{
dp[1] = min(dp[1], pre[0]);
}
}
else
{
dp[1] = pre[1] + 1;
if (nums2[i] > iMaxPre)
{
dp[1] = min(dp[1], pre[0] + 1);
}
}
pre.swap(dp);
}
return *std::min_element(pre.begin(), pre.end());
}
};

2023年6月版

class Solution {
public:
int minSwap(vector& nums1, vector& nums2) {
vector pre(2);//确保nums1[i-1]小于nums2[i-1] ,且nums1,nums2前i个元素符号条件需要变换次数
if (nums1[0] < nums2[0])
{
pre[1] = 1;
}
else
{
pre[0] = 1;
}
for (int i = 1; i < nums1.size(); i++)
{
int iPreMin = min(nums1[i - 1], nums2[i - 1]);
int iPreMax = max(nums1[i - 1], nums2[i - 1]);
vector dp(2);
bool bMinMorePreMax = min(nums1[i], nums2[i]) > iPreMax;
bool bNums1Min = nums1[i] <= nums2[i];
if (bNums1Min)
{
dp[0] = pre[0];
dp[1] = pre[1]+1;
if (bMinMorePreMax)
{
dp[0] = min(dp[0], pre[1]);
dp[1] = min(dp[1], pre[0] + 1) ;
}
}
else
{
dp[1] = pre[1];
dp[0] = pre[0] + 1;
if (bMinMorePreMax)
{
dp[1] = min(dp[1], pre[0]);
dp[0] = min(dp[0], pre[1] + 1);
}
}
pre.swap(dp);
}
return min(pre[0], pre[1]);
}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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/640267.shtml

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

相关文章

路飞项目--03

二次封装Response模块 # drf提供的Response&#xff0c;前端想接收到的格式 {code:xx,msg:xx} 后端返回&#xff0c;前端收到&#xff1a; APIResponse(tokneasdfa.asdfas.asdf)---->{code:100,msg:成功,token:asdfa.asdfas.asdf} APIResponse(code101,msg用户不存在) ---…

学习笔记-李沐动手学深度学习(一)(01-07,概述、数据操作、tensor操作、数学基础、自动求导)

个人随笔 第三列是 jupyter记事本 官方github上啥都有&#xff08;代码、jupyter记事本、胶片&#xff09; https://github.com/d2l-ai 多体会 【梯度指向的是值变化最大的方向】 符号 维度 &#xff08;弹幕说&#xff09;2&#xff0c;3&#xff0c;4越后面维度越低 4…

Java 面向对象案例 02 (黑马)

代码&#xff1a; public class foodTest {public static void main(String[] args) {//1、构建一个数组food[] arr new food[3];//2、创建三个商品对象food f1 new food("apple","123",3.2,500);food f2 new food("pear","456",4…

临时工说:AI 人工智能化对于DBA 的工作的影响

这开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共1900人左右 1 2 3 4 5&#xf…

ChatGPT:关于 OpenAI 的 GPT-4工具,你需要知道的一切

ChatGPT&#xff1a;关于 OpenAI 的 GPT-4工具&#xff0c;你需要知道的一切 什么是GPT-3、GPT-4 和 ChatGPT&#xff1f;ChatGPT 可以做什么&#xff1f;ChatGPT-4 可以做什么&#xff1f;ChatGPT 的费用是多少&#xff1f;GPT-4 与 GPT-3.5 有何不同&#xff1f;ChatGPT 如何…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

ONLYOFFICE服务器无法连接,请联系管理员问题解决

1、现象 部署好了nextcloud和onlyoffice后&#xff0c;新建文本文档报错ONLYOFFICE服务器无法连接&#xff0c;请联系管理员。 用快捷键“F12”进入控制台&#xff0c;点开错误提示栏&#xff0c;找到有“api.js“文件&#xff0c;“https://ONLYOFFICED的地址/web-apps/apps/…

书法AI全自动切字+识别算法2.0版发布,草书篆书行书楷书识别准确率超过90%,覆盖书法单字30万张

我们开发的业界识别最准覆盖作品最全的书法AI小程序上线了 书法AI全自动切字识别算法2.0版发布&#xff0c;草书篆书行书楷书识别准确率超过90%&#xff0c;准确率甩百度OCR一条街&#xff0c;覆盖书法单字30万张&#xff0c;遥遥领先同行 我们还可为客户提供书法AI全自动切字a…

借助文档控件Aspose.Words,将 Word DOC/DOCX 转换为 TXT

在文档处理领域&#xff0c;经常需要将 Word 文档转换为更简单的纯文本格式。无论是出于数据提取、内容分析还是兼容性原因&#xff0c;将 Word&#xff08;.doc、.docx&#xff09;文件转换为纯文本&#xff08;.txt&#xff09;的能力对于开发人员来说都是一项宝贵的技能。在…

87230系列USB连续波功率探头

01 87230 USB连续波功率探头 产品综述&#xff1a; 87230/87231/87232/87233系列USB功率探头是一款基于USB2.0全速/高速自适应接口的二极管检波式功率探头&#xff0c;内部采用高性能处理芯片&#xff0c;通过各种校准和补偿技术&#xff0c;使得探头具有频率范围宽、功率动…

基于SpringBoot的民宿预定管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

如何在CentOS8使用宝塔面板本地部署Typecho个人网站并实现公网访问【内网穿透】

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#…

重拾计网-第四弹 计算机网络性能指标

ps&#xff1a;本文章的图片内容来源都是来自于湖科大教书匠的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1.5 计算机网络的性能指标&#xff08;1&#xff09;_哔哩哔哩_bilibili ​​​ 目录 &#x…

最全笔记软件盘点!你要的笔记神器都在这里:手写笔记、知识管理、文本笔记、协作笔记等!

在当今的信息化社会中&#xff0c;人们对信息的处理速度越来越快&#xff0c;从工作到生活&#xff0c;我们都面临着大量信息的冲击。在这样的环境下&#xff0c;一个能够帮助我们管理、整理和储存信息的好工具显得尤为重要&#xff0c;而笔记软件恰恰可以满足这些需求。 在选…

工作小计- RGB相关算子实现

项目中的模型一直都是直接操作NV12的yuv格式数据&#xff0c;这次的模型只支持RGB格式的输入&#xff0c;正好来自己实现对应的算子。 这里记录一下对应算子的实现过程&#xff0c;主要涉及到NV12到RGB的变换&#xff0c;RGB的crop/resize操作&#xff0c;对于数据的Norm/ToFlo…

P1068 [NOIP2009 普及组] 分数线划定————C++、Python

目录 [NOIP2009 普及组] 分数线划定题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路C CodePython Code运行结果 [NOIP2009 普及组] 分数线划定 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A 市对所有报…

常用芯片学习——HC573芯片

HC573 三态输出八路透明 D 类锁存器 使用说明 锁存器是一种对脉冲电平敏感的存储单元电路&#xff0c;它们可以在特定输入脉冲电平作用下改变状态。锁存&#xff0c;就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存&#xff0c;其次完成高速的控制器与慢速的外设…

Android studio 之 适配器

ListView仅作为容器&#xff08;列表&#xff09;&#xff0c;用于装载 & 显示数据&#xff08;即 列表项Item&#xff09;而容器内的具体数据&#xff08;列表项Item&#xff09;则是由 适配器&#xff08;Adapter&#xff09;提供 适配器&#xff08;Adapter&#xff09…

《WebKit 技术内幕》学习之八(3):硬件加速机制

3 其他硬件加速模块 3.1 2D图形的硬件加速机制 其实网页中有很多绘图操作是针对2D图形的&#xff0c;这些操作包括通常的网页绘制&#xff0c;例如绘制边框、文字、图片、填充等&#xff0c;它们都是典型的2D绘图操作。在HTML5中&#xff0c;规范又引入了2D绘图的画布功能&a…

YARN节点故障的容错方案

YARN节点故障的容错方案 1. RM高可用1.1 选主和HA切换逻辑 2. NM高可用2.1 感知NM节点异常2.2 异常NM上的任务处理 4. 疑问和思考4,1 RM感知NM异常需要10min&#xff0c;对于app来说是否太长了&#xff1f; 5. 参考文档 本文主要探讨yarn集群的高可用容错方案和容错能力的探讨。…