一.原题描述

N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum number of swaps so that every couple is sitting side by side. A swap consists of choosing any two people, then they stand up and switch seats.

The people and seats are represented by an integer from 0 to 2N-1, the couples are numbered in order, the first couple being (0, 1), the second couple being (2, 3), and so on with the last couple being (2N-2, 2N-1).

The couples’ initial seating is given by row[i] being the value of the person who is initially sitting in the i-th seat.

Example 1:

Input: row = [0, 2, 1, 3]
Output: 1
Explanation: We only need to swap the second (row[1]) and third (row[2]) person.

Example 2:

Input: row = [3, 2, 0, 1]
Output: 0
Explanation: All couples are already seated side by side.

Note:

  1. len(row) is even and in the range of [4, 60].
  2. row is guaranteed to be a permutation of 0...len(row)-1.

二.中文描述

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

人和座位用 02N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2N-2, 2N-1)

这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。

示例 1:

输入: row = [0, 2, 1, 3]
输出: 1
解释: 我们只需要交换row[1]和row[2]的位置即可。

示例 2:

输入: row = [3, 2, 0, 1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。

说明:

  1. len(row) 是偶数且数值在 [4, 60]范围内。
  2. 可以保证row 是序列 0...len(row)-1 的一个全排列。

三.解题思路

1.此题我们先对数据进行观察,发现每一对情侣对应的数值差值为一,且每对情侣必须相邻,不分前后(即一对情侣0,1的排列也可以是1,0,只要两个人分别在相对应的奇数位与偶数位)

2.为了帮助理解,举出以下例子

第0位 第1位 第2位 第3位
人对应编号 1 0 2 3
人对应编号 2 3 0 1

上表为满足要求的数据

下面为测试数据

组别 第0位 第1位 第2位 第3位
第一组 0 2 1 3
第二组 3 2 0 1

3.接着就是解题了

(1)我们首先固定取偶数位进行判断(当然每组情侣也可以只判断奇数位),以上表测试数据为例,我们只需判断第0位和第2位.

(2)在第一组第0位判断时,我们首先看到为人0,其情侣的值应该为1,第二组第0位判断时,我们看到其为3,对应情侣为2,所以我们可以抽象出以下关系式:

j=cp[i]%2==0?cp[i]+1:cp[i]-1;

其中jcp[i]对应的情侣,当cp[i]为偶数时,其对应情侣等于cp[i]+1,当cp[i]为奇数时,其对应情侣等于cp[i]-1

(3)然后在上述关系式基础上我们进行循环,寻找到cp[i]对应的情侣后交换,此时代码如下:

for(int i=0;i<cp_len;i+=2){int j;j=cp[i]%2==0?cp[i]+1:cp[i]-1;if(cp[i+1]!=j){count0++;for(int m=i+2;m<cp_len;m++){if(cp[m]==j)//找到j了{swap(cp[m],cp[i+1]);//交换break;}}}}

i为我们检测的偶数位,j为cp[i]对应的情侣值,当cp[i+1]!=j时,我们从i+2位开始寻找j,找到后交换,重复此循环即可得到正确答案。

(4)完整源码如下:

#include<iostream>
using namespace std;class couple{public:int match_couple(int* cp,int lenth)
{count0=0;cp_len=lenth;for(int i=0;i<cp_len;i+=2){int j;j=cp[i]%2==0?cp[i]+1:cp[i]-1;if(cp[i+1]!=j){count0++;//  cout<<count0<<endl;for(int m=i+2;m<cp_len;m++){if(cp[m]==j){swap(cp[m],cp[i+1]);break;}}}}return count0;
}private:int count0;int cp_len;};void swap(int* a,int* b)
{*a=*a+*b;*b=*a-*b;*a=*a-*b;
}int main()
{couple couples;int a[]={0,2,1,3},lenth=0,swap_count=0;
lenth=sizeof(a)/sizeof(a[0]);
swap_count=couples.match_couple(a,lenth);
cout<<swap_count;return 0;}

leetcode765情侣牵手相关推荐

  1. LeetCode765.情侣牵手(Java)

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

  2. LeetCode765. 情侣牵手

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

  3. LeetCode-765.情侣牵手

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

  4. leetcode765.情侣牵手

    如果总共30对情侣,最多交换29次 解题思路:找到一对情侣,如果是邻座就不动,如果不是邻座,任意交换位置,让原本的两个邻座组成新的邻座 代码实现: public class Test765 {publ ...

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

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

  6. LeetCode——765. 情侣牵手(Couples Holding Hands)——分析及代码(Java)

    LeetCode--765. 情侣牵手[Couples Holding Hands]--分析及代码[Java] 一.题目 二.分析及代码 1. 并查集 (1)思路 (2)代码 (3)结果 三.其他 一 ...

  7. 力扣题库-765.情侣牵手 最优解法

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

  8. 【力扣】765. 情侣牵手

    以下为力扣的官方题解 765. 情侣牵手 题目 示例1 示例2 说明 官方题解 思路一 并查集 代码 复杂度分析 思路二 广度优先搜索 代码 复杂度分析 题目 NNN 对情侣坐在连续排列的 2N2N2 ...

  9. 765.情侣牵手问题 leetcode

    情侣牵手问题 解法一: 贪心 这个解题方法就是从0开始遍历,遍历的时候看看右边的是不是自己的对象,如果不是,就去找对象(把右边的人和自己对象交换位置).每次判断完后i加2. 怎么判断? 根据题意, 如 ...

最新文章

  1. pythonbreak可以跳出递归吗_怎样强制退出递归函数
  2. html设置页面大小_如何将Word文档页面大小设置为16开?
  3. sift的java实现解述
  4. 笔记-中项案例题-2019年下-人力资源管理和冲突管理
  5. Ubuntu下共享目录的设置
  6. DOM包裹wrap()方法
  7. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
  8. java redis工具类_redis Java工具类详解
  9. error C2065: 'assert' : undeclared identifier
  10. Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
  11. DirectX 入门知识
  12. Hive 窗口函数如何设置窗口大小
  13. VB DoEvents 的使用
  14. arcgis server 无法识别字体原因
  15. ADP(自适应动态规划)-值迭代
  16. 测绘-空中三角测量程序设计
  17. 第一节:Ajax 入门及环境
  18. 3月15日 | 开启 ICLR 2023预讲会专场二
  19. 深入理解Java7.pdf
  20. 十余种漂亮照片边框简单制作技巧

热门文章

  1. 在滴滴和头条干了 2 年开发后的总结和思考
  2. 批量处理千万模型,3D开发必备接口程序!老子云新版API,正式上线!
  3. 12306抢票 JAVA客户端
  4. 编程到底要不要学好数学?
  5. 27岁,没有学历,没有技术,大家有什么好的职业发展建议吗?
  6. 苹果开发证书导入电脑不受信任解决办法
  7. Tomcat配置路径
  8. FPGA学习笔记——wire和reg数据以及组合逻辑和时序逻辑
  9. 终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶
  10. python医学科研中能做什么-排名第一的Python语言,是如何应用于医疗临床?