在 c + + 中牵手的情侣

假设有N对夫妇,他们坐在连续排列的2N个座位上,想牵着手。我们必须找到交换的最小数量,以便每对夫妇并排坐着。

人员和座位由从0到2N-1的数字表示,对夫妇按顺序编号,例如第一对夫妇为(0,1),第二对夫妇为(2,3),依此类推,最后一对为(2N-2,2N-1)。

夫妇的初始座位由另一个称为row的数组给出,row [i]是最初坐在第i个座位的人的值。

因此,如果输入类似于[0,2,4,1,3,5],则输出将为2

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个称为UF的数据块,在此块中定义一些属性和功能,如下所示-

  • 定义一个父数组

  • 通过取值N初始化UF块,然后执行以下操作-

  • 数:= N

  • parent:=大小为N的数组

  • 对于初始化i:= 0,当i <N时,更新(将i增加1),执行-

    • 父母[i]:=我

  • 父母[i]:=我

  • parA:= getParent(a)

  • parB:= getParent(b)

  • 如果parA与parB相同,则-

    • 返回

  • (将计数减少1)

  • parent [parB]:= parA

  • 定义一个函数getParent(),这需要我,

  • 如果parent [i]与i相同,则-

    • 还给我

  • 返回parent [i] = getParent(parent [i])

  • 从主要方法中执行以下操作-

  • n:=行的大小,N:= n / 2

  • 创建一个名为uf的UF块并用N初始化

  • 对于初始化gr:= 0,当gr <N时,更新(将gr增加1),执行-

    • 一个:=行[gr * 2]

    • b:=行[gr * 2 +1]

    • 调用uf的unionn(a / 2,b / 2)

  • 返回N-uf的计数

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   class UF{
      public:
      vector<int> parent;
      int count;
      UF(int N){
         count = N;
         parent = vector<int>(N);
         for (int i = 0; i < N; i++) {
            parent[i] = i;
         }
      }
      void unionn(int a, int b){
         int parA = getParent(a);
         int parB = getParent(b);
         if (parA == parB)
         return;
         count--;
         parent[parB] = parA;
      }
      int getParent(int i){
         if (parent[i] == i)
         return i;
         return parent[i] = getParent(parent[i]);
      }
   };
   int minSwapsCouples(vector<int>& row) {
      int n = row.size();
      int N = n / 2;
      UF uf(N);
      for (int gr = 0; gr < N; gr++) {
         int a = row[gr * 2];
         int b = row[gr * 2 + 1];
         uf.unionn(a / 2, b / 2);
      }
      return N - uf.count;
   }
};
main(){
   Solution ob;
   vector<int> v = {0,2,4,1,3,5};
   cout << (ob.minSwapsCouples(v));
}

输入项

{0,2,4,1,3,5}

输出结果

2