Skip to content

Commit 89422d7

Browse files
committed
Time: 6 ms (11.57%), Space: 7.4 MB (56.93%) - LeetHub
1 parent d80bcc5 commit 89422d7

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
struct dsu {
2+
vector<int> parent;
3+
vector<int> _size;
4+
5+
// merge two sets having a&b as entities
6+
void union_sets(int a, int b) {
7+
a = find_set(a);
8+
b = find_set(b);
9+
if (a != b) {
10+
if (_size[a] < _size[b])
11+
swap(a, b);
12+
parent[b] = a;
13+
_size[a] += _size[b];
14+
}
15+
}
16+
17+
// find the set leader
18+
int find_set(int v) {
19+
if (v == parent[v])
20+
return v;
21+
return parent[v] = find_set(parent[v]);
22+
}
23+
24+
// check if same set/leader
25+
bool same_comp(int a, int b) {
26+
return find_set(a) == find_set(b);
27+
}
28+
29+
void make_set(int v) {
30+
parent[v] = v;
31+
_size[v] = 1;
32+
}
33+
34+
void _init(int n) {
35+
parent.assign(n, 0);
36+
_size.assign(n, 0);
37+
38+
for (int i = 0; i < n; i++)
39+
make_set(i);
40+
}
41+
};
42+
43+
class Solution {
44+
public:
45+
int minSwapsCouples(vector<int>& row) {
46+
int n = row.size();
47+
n /= 2;
48+
49+
dsu D;
50+
D._init(n + 1);
51+
int ccs = n;
52+
for (int i = 0; i < 2 * n; i += 2){
53+
if(D.find_set(row[i]/2) != D.find_set(row[i+1]/2)){
54+
D.union_sets(row[i]/2, row[i+1]/2);
55+
ccs--;
56+
}
57+
}
58+
59+
return (n - ccs);
60+
}
61+
};

0 commit comments

Comments
 (0)