问题描述

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. IDEA激活 重置试用30天

    转载于 https://www.cnblogs.com/renlywen/p/14216325.html jetbrains-agent已经停止,现在又出现了新的激活方式,重置试用时间,以下为操作步骤 ...

  2. Tomcat配置中的java.lang.IllegalStateException: No output folder问题

    最近运行Tomcat7.0时总会报错:Tomcat安装文件夹下的某个文件拒绝访问. localhost:8080 java.lang.IllegalStateException: No output ...

  3. 在使用IDEA提交git代码时,如何修改提交者的名字

    在Terminal终端中输入 git config user.name git config --global user.name "xl"

  4. iOS开发之UIImage在压缩时失真问题,压缩图片的大小

    今天遇到UIImage在压缩时失真问题,压缩图片的大小图片模糊 错误的方案 /** * 压缩图片 * image:将要压缩的图片 size:压缩后的尺寸 */ -(UIImage*) OriginIm ...

  5. centos系统时间与硬件时间不一致

    centos系统时间与硬件时间设置.同步 将系统时间设置成2018年7月31日 12:00:00 date -s "07/31/18  12:00:00" hwclock -s 将 ...

  6. hadoop服务异常,磁盘坏道critical medium error,dev sdh,sector xxxx

    运行spark之后,部分任务失败,排查查看操作系统日志(/var/log/message),发现磁盘坏道,导致服务异常.异常主要错误"critical medium error,dev sd ...

  7. flex_bison

    flex_bison flex flex词法分析器,可以利用正则表达式来生成匹配相应字符串的C语言代码,其语法格式基本同Lex相同.单词的描述称为模式(Lexical Pattern),模式一般用正规 ...

  8. 【转载】C++标准库容器与C#容器对比

    转载自栈他喵的又溢出了 我简单的整理一下,方便观看: C#容器 C++容器 备注 Array C array .net的Array可以是非0起始索引(鸡肋?查了一下,用Array.CreateInst ...

  9. NGINX一次电脑自己可以访问其它IP访问不了

    配制好NGINX 本地电脑curl http..... 正常访问...其它电脑不可以 第一想法防火墙 查一下  firewall-cmd --state not running 然后查下是不是服务开启 ...

  10. Android版本历史

    版本 Code Name 代号 API 日期 NDK 1.0 Astro 铁臂阿童木  1     1.1 Bender, Petit Four 发条机器人 2     1.5 Cupcake  纸杯 ...