同类题目:
947. 移除最多的同行或同列石头
移除最多的同行或者同列的石头
并查集特点:
用一个一位数组来保存每个元素的根节点,不断合并元素(通过合并根节点),来统计元素的连通情况。在多处情况下用于处理多个不相交的集合情况(多个连通集)。点击查看更多
思路:由于在本题中为删除的同行或者同列的石头,所以将行和列来进行合并(判断相邻结点的时候,多用于点与点之间的合并)。所以声明一个一维的数组用以保存每个行或者列的根节点。在本题中,列的结点对应的为10000+stones[i][1]是由于区分行和列,不能使行或者列重复,否则会无法区分导致无法合并。所以待运算结束后,arr存储的是每个元素的父节点。
class Solution {
int[] arr=new int[20000];//stones[i][j]最大值为10000
public int removeStones(int[][] stones) {
//实际上为输出来南通分量的个数
Arrays.fill(arr,-1);
for(int i=0;i<stones.length;i++){
merge(stones[i][0],stones[i][1]+10000);
}
Set s=new HashSet<>();
for(int i=0;i<stones.length;i++){
s.add(getParent(stones[i][0]));
}
return stones.length-s.size();
}
public int getParent(int i){
if(arr[i]==-1){
return i;
}
return getParent(arr[i]);
}
public void merge(int i,int j){
int index1=getParent(i);
int index2=getParent(j);
if(index1!=index2){
arr[index1]=index2;
}
}
}
于2020/10/14开始编辑,持续更新