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

原题链接

根据题意我们可以得到一个很有趣的结论:处于同一行或者同一列的石头是共处一个集合的,而一个集合最终可以消除到只剩一个石头。(可以实验一下)

因此我们采取并查集实现。

Code

 

class Solution {
public:
    int sum=0;
    int father[1005];
    map<int ,int >mapx;
    map<int ,int >mapy;
    int find(int x){
        if (father[x]!=x){
            father[x]=find(father[x]);
        }
        return father[x];
    }
    void Union(int x,int y){
        int fx=find(x);
        int fy=find(y);
        if (fx!=fy){
            father[fx]=fy;
            sum--;
        }
    }
    int removeStones(vector<vector<int>>& stones) {
        int n=stones.size();
        sum=n;
        for(int i=0;i<n;i++) father[i]=i;
        for (int i=0;i<n;i++){
            if (mapx.count(stones[i][0])){
                Union(i,mapx[stones[i][0]]);
            }
            else mapx[stones[i][0]]=i;
            if (mapy.count(stones[i][1])){
                Union(i,mapy[stones[i][1]]);
            }
            else mapy[stones[i][1]]=i;
        }
        return n-sum;
    }
};

 

posted @ 2024-02-14 15:19  黑屿白  阅读(16)  评论(0)    收藏  举报