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 크기의 배열
-
initialize i :=0의 경우, i
-
부모[i] :=나는
-
-
부모[i] :=나는
-
paraA :=getParent(a)
-
parB :=getParent(b)
-
parA가 parB와 같으면 -
-
반환
-
-
(1씩 감소)
-
부모[parB] :=parA
-
getParent() 함수를 정의하면 i가 필요합니다.
-
부모[i]가 i와 같으면 -
-
반환 i
-
-
부모[i] 반환 =getParent(부모[i])
-
주요 방법에서 다음을 수행하십시오 -
-
n :=행의 크기, N :=n / 2
-
uf라는 하나의 UF 블록을 만들고 N
으로 초기화합니다. -
초기화 gr :=0의 경우 gr
-
a :=행[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