class Solution {
public int minSwapsCouples(int[] row) {
int len = row.length;
int N = len / 2;
UnionFind unionFind = new UnionFind(N);
for (int i = 0; i < len; i += 2) {
unionFind.union(row[i] / 2, row[i + 1] / 2);
}
return N - unionFind.getCount();
}
private class UnionFind {
private int[] parent;
private int count;
public int getCount() {
return count;
}
public UnionFind(int n) {
this.count = n;
this.parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
//找出根节点,如果只有一个节点,根节点是自己
//作循环,如果父节点不是自己,一直循环
public int find(int x) {
while (x != parent[x]) {
x=parent[x];
}
return x;
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) {
return;
}
parent[rootX] = rootY;
count--;
}
}
}
并查集自己的理解 刚开始每个节点都是看作单独的集合,现在要合并一些节点,如果合并的两个节点的父节点相同,说明已经是在一个集合中了,否则之前就不在一个集合中,将这两个节点的父节点相连,组成一个集合,此时集合数减一。