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