问题描述

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. vue3中reactive数据被重新赋值后无法双向绑定,使用reactive包裹数组如何正确赋值?

    需求:将接口请求到的列表数据赋值给响应数据arr const arr = reactive([]); const load = () => { const res = [2, 3, 4, 5]; ...

  2. 查找php-fpm

    [root@VM-4-6-centos /]# find / -name php-fpm/opt/remi/php74/root/usr/sbin/php-fpm/etc/opt/remi/php74 ...

  3. reduced form(简化式)和structural form(结构式)

    在复习软件构造的时候,我发现了这样一道练习题 例题要求我们对照给出的RI和AF画出相应的映射图.在这里产生了一个疑问,什么是reduced form?是分子小于分母的意思吗? 但是根据给出的答案,并不 ...

  4. HCIP-ICT实战进阶05-路由策略与策略路由

    HCIP-ICT实战进阶05-路由策略与策略路由 0 前言 什么是路由策略? 基于报文的目的IP地址进行路由表查找, 之后转发数据; 针对控制平面, 为路由协议和路由表服务, 针对路由信息进行过滤或者 ...

  5. wireguard 在openwrt中的配置

    按照网上教程正常配置,防火墙通信规则中,选择打开监听端口,目标设备:设备(输入),目标端口:监听端口. 客户端设置:注意路由器的IP地址(段)要填0.0.0.0/0.

  6. clearfix解决高度塌陷和外边距重合问题

  7. IE和FireFox 对FORM enctype属性的认识存在差异

    IE和FireFox 对FORM enctype属性的认识存在差异,一般来说对于动态创建的form,如果因为要上传文件的原因很自然的会使用类似如下的代码: 1  //create form 2  th ...

  8. Django项目创建应用(二)

    四.创建应用 一个项目里可以创建多个应用,每个应用进行一种业务处理 (1)激活当前项目的环境 D:\pythonProject2023\djangoProject>activate python ...

  9. django 事务踩坑

    with transaction.atomic(): save_id = transaction.savepoint() #xx.字段A ormg更新操作 #提交事务 transaction.save ...

  10. jsonpath表达式

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容,其中正则表达式的包含或不包含配制有时候非常有用! json操作实例 { "store": { "book ...