暑假算法7.27,Day26

暑假算法7.27,Day26

并查集

第一题

省份数量

class Solution {
    int[] parent;
    int count;

    public int find(int p) {
        while (p != parent[p]) {
            parent[p] = parent[parent[p]];
            p = parent[p];
        }
        return p;
    }

    public void union(int p, int q) {
        int rootP = find(p);
        int rootQ = find(q);
        if (rootP == rootQ)
            return;
        parent[rootP] = rootQ;
        count--;
    }

    public int findCircleNum(int[][] isConnected) {
        int N = isConnected.length;
        // 连通分量个数
        count = N;
        // 连接关系
        parent = new int[N];
        count = N;
        for (int i = 0; i < N; i++) {
            parent[i] = i;
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (isConnected[i][j] == 1)
                    union(i, j);
            }
        }
        return count;
    }
}

请添加图片描述

第二题

二维网格中探测环

class Solution {
    #define maxn 250005
    int fa[maxn];
    int row,col;
    int dir[2][2]={{0,1},{1,0}};
    void init(){
        for(int i=0;i<maxn;++i){
            fa[i]=i;
        }
    }
    int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]); 
    }
    int union_( int x,int y){
        int fx=find(x);
        int fy=find(y);
        if(fx!=fy){
            fa[fx]=fy;
            return 1;
        }
        return 0;//返回0代表二者已经在一个集合中,1代表将二者union到一起了
    }
public:
    bool containsCycle(vector<vector<char>>& grid) {
        init();
        row=grid.size();
        col=grid[0].size();
        for(int i=0;i<row;++i){
            for(int j=0;j<col;++j){
                for(int k=0;k<2;++k){
                    int ti=i+dir[k][0];
                    int tj=j+dir[k][1];
                    if(ti==row||tj==col){
                        continue;
                    }
                    int a=i*col+j;
                    int b=ti*col+tj;
                    if(grid[i][j]==grid[ti][tj]){
                        if(!union_(a,b)){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
};

请添加图片描述

第三题

冗余链接

class Solution {
public:
    int find(vector<int>& father, int u) {
        return father[u] == u ? u : (father[u] = find(father, father[u]));
    }

    void merge(vector<int>& father, int u, int v) {
        int x = find(father, u), y = find(father, v);
        if(x == y) return;
        father[x] = y;
    }

    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        vector<int> father(edges.size() + 1);
        for(int i = 0; i <= edges.size(); i++) {
            father[i] = i;
        }
        int num = 0;
        for(int i = 0; i < edges.size(); i++) {
            if(find(father, edges[i][0]) != find(father, edges[i][1])) {
                merge(father, edges[i][0], edges[i][1]);
            }
            else {
                return edges[i];
            }
        }
        return vector<int>{};
    }
};

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值