1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| class Solution { private static class UnionFind {
private final int[] parent; private final int[] size;
public UnionFind(int n) { this.parent = new int[n]; for (int i = 0; i < this.parent.length; i++) { parent[i] = i; } this.size = new int[n]; Arrays.fill(size, 1); }
public void union(int x, int y) { int xRoot = getRoot(x), yRoot = getRoot(y); if (xRoot == yRoot) { return; }
if (size[xRoot] < size[yRoot]) { parent[xRoot] = yRoot; size[yRoot] += size[xRoot]; } else { parent[yRoot] = xRoot; size[xRoot] += size[yRoot]; } }
public int getRoot(int x) { if (parent[x] != x) { parent[x] = getRoot(parent[x]); }
return parent[x]; }
}
public int minSwapsCouples(int[] row) { int n = row.length; int pairs = n / 2;
UnionFind unionFind = new UnionFind(pairs); for (int i = 0; i < row.length; i += 2) { unionFind.union(row[i] / 2, row[i + 1] / 2); }
int circle = 0; for (int i = 0; i < pairs; i++) { if (i == unionFind.getRoot(i)) { circle++; } }
return pairs - circle; } }
|
References
765. Couples Holding Hands