Most Stones Removed with Same Row or Column
On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at most one stone.
Now, a move consists of removing a stone that shares a column or row with another stone on the grid.
What is the largest possible number of moves we can make?
Example 1:
Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
Output: 5
Example 2:
Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
Output: 3
Example 3:
Input: stones = [[0,0]]
Output: 0
Note:
1 <= stones.length <= 1000
0 <= stones[i][j] < 10000
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);
}
}
Last updated