java笔试--并查集

同类题目:
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开始编辑,持续更新

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值