LeetCode 765.情侣牵手 Couples Holding Hands

题目链接

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

情侣们按照顺序编号,(0,1)是一对,(2,3)是一对,...(2N-2,2N-1)是一对。

这些情侣们的初始座位为数组row[]。

例如:row=[0,2,1,3],只需交换row[0]和row[3],或者交换row[1]和row[2]即可,交换次数为1。


思路:

1、为了找到所属的另一半,不能每次都进行遍历查找。因此,需要另一个数组arr[],存储每个人所在row[]中的位置。

2、以row=[0,2,1,3]为例,0想要找到另一半1,先找到1所在的位置,为arr[1]=2。之后,0为了和1坐在一起,0抢占3的位置(为什么不是抢占2的位置呢)。没有座位的3,自然是又进行寻找另一半2的位置的过程。

3、按照步骤2的方法,如果记录抢位置次数作为交换次数的话,会比实际交换次数多1。

4、怎么结束步骤2的循环呢,0原本所在的row[0]的位置被抢占后,循环就结束。

5、如果row=[0,2,1,3,4,6,5,7],只从0找的话,后面的4、6、5、7无法凑成一对,所以需要依次判断row[2i]和row[2i+1]是否是情侣,如果不是,则进行步骤2。

6、最后代码如下:

class Solution {
public:
    int minSwapsCouples(vector& row) {
        int a[100]={0};//存储每个人所在row[]的位置
        int len=row.size();
        for(int i=0;i

你可能感兴趣的:(LeetCode)