class Solution {
public int removeStones(int[][] stones) {
int[] parent = new int[20000];
for (int i = 0; i < 20000; ++i)
parent[i] = i;
int N = stones.length;
// build unions
for (int[] stone : stones) {
union(stone[0], stone[1] + 10000, parent);
}
Set<Integer> seen = new HashSet();
for (int[] stone : stones) {
// One component has one top parent
seen.add(find(stone[0], parent));
}
// Now we can remove everything except one stone from each component
return N - seen.size();
}
public int find(int x, int[] parent) {
if (parent[x] != x)
parent[x] = find(parent[x], parent);
return parent[x];
}
public void union(int x, int y, int[] parent) {
parent[find(x, parent)] = find(y, parent);
}
}