问题描述

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.length
  • 2 <= n <= 30
  • n 是偶数
  • 0 <= row[i] < 2n
  • row 中所有元素均 无重复

解题思路

我们只需要遍历i = 0, 2, 4, 6, ...,如果row[i]为偶数,就把row[i] + 1换到row[i + 1]的位置;如果row[i]为奇数,就把row[i] - 1换到row[i + 1]的位置,利用一个row[i]keyivalue的哈希表和原数组来模拟这个过程。

代码

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)的更多相关文章

  1. Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)

    Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...

  2. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)

    765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...

  3. [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 ...

  4. [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 ...

  5. LeetCode-765.情侣牵手

    N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 到 2N-1 的整 ...

  6. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  7. leedcode_贪心算法系列

    861. 翻转矩阵后的得分 思路: 行首的权值最大,故首先将其置1; 每列由于权值相同,故只需要将0多于1的情况反转即可 763. 划分字母区间 思路: 1.计算每个字母的最右边界下标,并记录到新数组 ...

  8. 2019年9月Leetcode每日训练日志

    2019-09-16 #1171 从链表中删去总和值为零的连续节点 #1170 比较字符串最小字母出现频次 #1169 查询无效交易 #226 翻转二叉树 2019-09-15 #1190 反转每对括 ...

  9. leetcode难题

    4 寻找两个有序数组的中位数       35.9% 困难     10 正则表达式匹配       24.6% 困难     23 合并K个排序链表       47.4% 困难     25 K ...

  10. C#LeetCode刷题-图

    图篇 # 题名 刷题 通过率 难度 133 克隆图   18.7% 中等 207 课程表   40.0% 中等 210 课程表 II   40.0% 中等 310 最小高度树   29.5% 中等 3 ...

随机推荐

  1. C语言中static关键字用法

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内 ...

  2. PS技能之电子签名+修白牙齿

    PS技能 NO.1 电子签名 有时候由于时空的限制,本人无法签字,那么电子签名就有了它的作用啦![注:谨慎使用] 亲试有效的教程,现在就是做笔记的时候啦! 教程链接如下: https://blog.c ...

  3. ETCD 实现服务发现讲解

    租约:具有时间有效期,键绑定到租约后,当租约到期失效,绑定到的租约的键也会被删除. 创建租约 etcdctl lease grant 600 lease 694d81f509b7940a grante ...

  4. mybatis读取blob类型

    mybatis 读取blob数据 mybatis读取blob数据过程: 1.从数据库中读出blob数据类型,用pojo中的byte[]接收. 2.把文件保存成文件(或者变成base64也行). Cus ...

  5. linux办公

    办公环境.生产环境: centos.redhat.big cloud 1.改PS1:生产主机的主机名太长了,每次显示占半行 [root@10.0.0.11 ~]$ echo $PS1 [\u@10.0 ...

  6. application.yaml

    spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: j ...

  7. 如何理解Vue中的组件?

    Vue2.6已经更新了关于内容插槽和作用域插槽的API和用法,为了不误导大家,我把插槽的内容删除了.详情请看官网 2018-07-19更新: 更新作用域插槽的属性: scope -> slot- ...

  8. SpringMVC学习day03

    第1个springmvc程序 这是根据狂神说视频和资料学习的,用于加强自己的记忆 入门学习 1. 步骤: 1.新建一个Moudle , springmvc-02-hello , 添加web的支持! 2 ...

  9. GIT Authentication failed for错误问题处理

    1. Settings ==> Developer settings ==> Personal access tokens ==> Generate new token   生成新的 ...

  10. Django操作mongo数据库一(配置文件里写连接信息)

    一.基本环境 1.开发环境: Python环境:Python 3.8.16 Django环境:4.1 2.需要安装的包 pip install pymongo pip install mongoeng ...