2021-01-15 947.移除最多的同行或同列石头 [并查集]

947.移除最多的同行或同列石头

思路一:并查集

其实这道题看似花里胡哨,实际上能移除的石头个数就是石头总个数减去属于同一类别(我们把处于同一列同一行能联通的石头放在一类)的石头个数。因为一坨互相联通的石头之间总可以移除到只剩下一块。
这个想法的证明可以倒过来想,如果只剩一块,根据我们分类的定义,只要没有达到该类别总个数,一定存在同一类的元素与其相连(处于同一行或者同一列),因此可以添加到两块,以此类推,就可以还原到最初状态。
又因为能加一块就一定能删一块,因此,我们证明了一坨互相联通的石头之间总可以移除到只剩下一块。

class Solution {
   
    public int removeStones(int[][] stones) {
   
        // 第一步,初始化每一块石头,这里由题目假设知,不会由两块石头放在同一个位置上
        Stone[] st = new Stone[stones.length];
        for(int i=0;i<stones.length;i++){
   
            st[i] = new Stone(stones[i]);
            // System.out.println(st[i].index);
        }

        // 第二步:将同行同列的石头合并在一起
        UnionFind uf = new UnionFind(st.length);
        for(int i=0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值