题目链接
题目:在二维平面上,我们将石头放置在一些整数坐标点上。每个坐标点上最多只能有一块石头。
现在,move 操作将会移除与网格上的另一块石头共享一列或一行的石头。
我们最多能执行多少次 move 操作?
示例:示例 1:
输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]
输出:5
示例 2:
输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]
输出:3
示例 3:
输入:stones = [[0,0]]
输出:0
别人思路:使用并查集来轻松解决这个问题。其实就是找出图中存在几个连通子图,然后用石头的总数量减去连通子图的数量即可。
关于并查集,我也不了解,看了这篇文章就豁然开朗,不明白的可以了解下并查集详解 ——图文解说,简单易懂
class Solution {
public int removeStones(int[][] stones) {
int len = stones.length;
DSU dsu = new DSU(20000);
for(int i = 0; i < len; i++){
dsu.union(stones[i][0], stones[i][1] + 10000);
}
Set<Integer> set = new HashSet();
//查看连通子图的数量
for(int[] stone : stones){
set.add(dsu.find(stone[0]));
}
return len - set.size();
}
}
//构建并查集类
class DSU{
int pre[];
public DSU(int n){
pre = new int[n];
for(int i = 0; i < n; i++){
pre[i] = i;
}
}
public int find(int x){
while(pre[x] != x){
x = pre[x];
}
return x;
}
public void union(int x, int y){
int fx = find(x);
int fy = find(y);
if(fx != fy){
pre[fx] = fy;
}
}
}