Union rows with columns
Time O(n α(n)) Space O(20002)For stone (x, y), union x with y + 10001 (so columns don't clash with rows). Count distinct roots among the used row/column nodes. Answer = stones − groups.
import java.util.*;
class Solution {
private final int[] parent = new int[20002];
public int removeStones(int[][] stones) {
for (int i = 0; i < parent.length; i++) parent[i] = i;
for (int[] s : stones) parent[find(s[0])] = find(s[1] + 10001);
Set<Integer> roots = new HashSet<>();
for (int[] s : stones) roots.add(find(s[0]));
return stones.length - roots.size();
}
private int find(int x) {
while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }
return x;
}
}Verdict: Avoids comparing every pair of stones.