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 的資料塊,在這個資料塊中定義一些屬性和函式,如下所示:

  • 定義一個數組 parent。

  • 透過傳入一個值 N 初始化 UF 資料塊,然後執行以下操作:

  • count := N

  • parent := 一個大小為 N 的陣列

  • 初始化 i := 0,當 i < N 時,更新(i 加 1),執行以下操作:

    • parent[i] := i

  • parent[i] := i

  • parA := getParent(a)

  • parB := getParent(b)

  • 如果 parA 等於 parB,則:

    • 返回

  • (count 減 1)

  • parent[parB] := parA

  • 定義一個函式 getParent(),它將接收 i,

  • 如果 parent[i] 等於 i,則:

    • 返回 i

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

  • 從主方法執行以下操作:

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

  • 建立一個名為 uf 的 UF 資料塊並用 N 初始化

  • 初始化 gr := 0,當 gr < N 時,更新(gr 加 1),執行以下操作:

    • a := row[gr * 2]

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

    • 呼叫 uf 的 unionn(a / 2, b / 2)

  • 返回 N - uf 的 count

讓我們看看以下實現,以便更好地理解:

示例

 線上演示

#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

更新時間: 2020年6月8日

295 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.