765. 情侣牵手 (Hard)
问题描述
n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。
人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的
ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是
(2n-2, 2n-1)。
返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次 交换可选择任意两人,让他们站起来交换座位。
示例 1:
输入: row = [0,2,1,3]
输出: 1
解释: 只需要交换row[1]和row[2]的位置即可。
示例 2:
输入: row = [3,2,0,1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。
提示:
2n == row.length2 <= n <= 30n是偶数0 <= row[i] < 2nrow中所有元素均 无重复
解题思路
我们只需要遍历i = 0, 2, 4, 6, ...,如果row[i]为偶数,就把row[i] + 1换到row[i + 1]的位置;如果row[i]为奇数,就把row[i] - 1换到row[i + 1]的位置,利用一个row[i]为key,i为value的哈希表和原数组来模拟这个过程。
代码
class Solution {
public:
int minSwapsCouples(vector<int> &row) {
std::unordered_map<int, int> ump; // row[i]为键,i为值
for (int i = 0; i < row.size(); i++) {
ump[row[i]] = i;
}
int cnt = 0;
for (int i = 0; i < row.size(); i += 2) {
// 应该还是要遍历row才对
if (row[i] % 2 == 0) { // 偶数
if (row[i + 1] != row[i] + 1) {
cnt++;
int tmp = ump[row[i] + 1]; // 原先的位置
int tmp_per = row[i + 1]; // i + 1座位上原先那个人的id
// 交换了row
row[i + 1] = row[i] + 1;
row[tmp] = tmp_per;
// 交换ump
ump[row[i] + 1] = i + 1;
ump[tmp_per] = tmp;
}
} else {
if (row[i + 1] != row[i] - 1) {
cnt++;
int tmp = ump[row[i] - 1]; // 原先的位置
int tmp_per = row[i + 1]; // i + 1座位上原先那个人的id
// 交换了row
row[i + 1] = row[i] - 1;
row[tmp] = tmp_per;
// 交换ump
ump[row[i] - 1] = i + 1;
ump[tmp_per] = tmp;
}
}
}
return cnt;
}
};
765. 情侣牵手 (Hard)的更多相关文章
- Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)
Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...
- Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...
- [LeetCode] 765. Couples Holding Hands 情侣牵手
N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...
- [Swift]LeetCode765. 情侣牵手 | Couples Holding Hands
N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...
- LeetCode-765.情侣牵手
N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 到 2N-1 的整 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- leedcode_贪心算法系列
861. 翻转矩阵后的得分 思路: 行首的权值最大,故首先将其置1; 每列由于权值相同,故只需要将0多于1的情况反转即可 763. 划分字母区间 思路: 1.计算每个字母的最右边界下标,并记录到新数组 ...
- 2019年9月Leetcode每日训练日志
2019-09-16 #1171 从链表中删去总和值为零的连续节点 #1170 比较字符串最小字母出现频次 #1169 查询无效交易 #226 翻转二叉树 2019-09-15 #1190 反转每对括 ...
- leetcode难题
4 寻找两个有序数组的中位数 35.9% 困难 10 正则表达式匹配 24.6% 困难 23 合并K个排序链表 47.4% 困难 25 K ...
- C#LeetCode刷题-图
图篇 # 题名 刷题 通过率 难度 133 克隆图 18.7% 中等 207 课程表 40.0% 中等 210 课程表 II 40.0% 中等 310 最小高度树 29.5% 中等 3 ...
随机推荐
- Loading Methods
Datasets datasets.list_datasets return:List all the datasets scripts available on the Hugging Face H ...
- vue中input触发方法中调用ajax,导致input失去焦点问题
发现在vue中监控input绑定的值,调用方法时,如果方法中有调用后端接口(使用Ajax),会导致input输入框失去焦点,这样导致的问题就是每输入一个字符,就要重新聚焦一次,可通过以下方式在方法中重 ...
- mysql修改密码遇到的问题
在docker上安装了 mysql 容器,mysql镜像是8.0+版本 修改密码语句: 只针对本机生效 alter user "root"@'localhost' identifi ...
- 02 python初识
Python初识 一.入门基础 1. 第一个Python程序 python 代码都是编写在以 .py 结尾的文件中.我们随便新建一个文件,并将文件后缀名改为 .py,在里面编写我们的第一个 pytho ...
- uniapp对接ChatGPT 简单实现对话功能
最近很火的ChatGPT来了!我也是做了一个最最基础的模型,让大家更通俗易懂! 先看效果: 接下来直接上代码: <template> <view class="conte ...
- Qt 中文编译错误和运行显示乱码
Qt 中文编译错误 Qt error: C2001: 常量中有换行符 解决方法:菜单 --> 编辑 --> 选择编码(select Encoding)--> 文本编码 --> ...
- 错误 C2664 “int fputs(const char *,FILE *)”: 无法将参数 1 从“char”转换为“const char *”解决方法
遇到这个问题,请打开本项目的Properties(属性) -------> Configuration Properties(配置属性) -------->General(常规) ---- ...
- Neo4J之Cypher 第三章
Cypher是一种声明式图形查询语言,可用于表达性和高效的图形查询和更新.它旨在同时适合开发人员和运营专业人员.Cypher的设计既简单又强大.可以轻松表达高度复杂的数据库查询,使您可以专注于自己的域 ...
- sleep(0)的意义
Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行. Thread.Sleep(0) 是你 ...
- WPF 使用Path(自定义控件,圆形进度条)
原文:https://www.cnblogs.com/tsliwei/p/5609035.html 原文链接:https://blog.csdn.net/johnsuna/article/detail ...