DAY16 - 并查集

并查集是一种树状的结构,可以用来表示两个节点的连接、查询两个节点的连接~~
在刷题的时候有时候会使用到,就直接把并查集刻出来

class dsu{
public:
    unordered_map<int, int> arr;
    //找源头
    int find(int target){
        if(arr[target]==target){
            return target;
        }
        arr[target] = find(arr[target]);
        return arr[target];
    }
    //把b并进a
    void merge(int a, int b){
        int a_head = find(arr[a]);
        int b_head = find(arr[b]);
        arr[b] = a_head;
        return;
    }
};

上篇文章有提到,有时候会这样写(加权Union)(quick Union)

class dsu{
private:
    vector<int> arr;
    vector<int> ssize;
public:
    dsu(int n){
        arr.resize(n+1);
        ssize.resize(n+1);
        for(int i = 1; i<n+1; ++i){
            arr[i] = i;
            ssize[i] = 1;
        }
    }
    int find(int i){
        if(arr[i]==i){
            return i;
        }
        return find(arr[i]);
    }
    void merge(int a, int b){
        int a_head = find(a);
        int b_head = find(b);
        if(a_head!=b_head){
            if(ssize[a_head]>ssize[b_head]){//a较大
                arr[b_head] = a_head; //b并进a
                ssize[a_head]+=ssize[b_head];
            }
            else{
                arr[a_head] = b_head;
                ssize[b_head]+=ssize[a_head];
            }
            //arr[b_head] = a_head;
        }
    }
};

例题实战

547. 省份数量
这应该算是模板题~~

class dsu{
public:
    int arr[201];
    dsu(){
        for(int i = 0; i<201; ++i){
            arr[i] = i;
        }
    }
    void merge(int a, int b){ //将b并进a
        int a_head = find(a);
        int b_head = find(b);
        arr[b_head] = a_head;
    }
    int find(int i){
        if(i==arr[i]){
            return i;
        }
        return arr[i] = find(arr[i]);
    }
};
class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        int n = isConnected.size();
        dsu ddsu;
        for(int i = 0; i<n; ++i){
            for(int j = 0; j<n; ++j){
                if(isConnected[i][j]==1){
                    ddsu.merge(i, j);
                }
            }
        }
        int res = 0;
        for(int i = 0; i<n; ++i){
            if(ddsu.arr[i]==i){
                res++;
            }
        }
        return res;
    }
};

128. 最长连续序列
刷并查集一定要看一下这题~~
思路就是把i并入i+1
((但最後似乎直接sort比较快...)

class dsu{
public:
    unordered_map<int, int> arr;
    int find(int target){
        if(!arr.count(target)){
            return target;
        }
        if(arr[target]==target){
            return target;
        }
        arr[target] = find(arr[target]);
        return arr[target];
    }
    //把b并进a
    void merge(int a, int b){
        int a_head = find(arr[a]);
        int b_head = find(arr[b]);
        arr[b] = a_head;
        return;
    }
};
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        dsu ddsu;
        for(auto i:nums){
            ddsu.arr[i]=i+1; //将i并入i+1
        }
        int ans=0;
        for(auto i:nums){
            int y=ddsu.find(i+1);
            ans=max(ans,y-i);
        }
        return ans;
    }
};

<<:  TailwindCSS 从零开始 - 起手式

>>:  Day8-安装Kind要在docker之後

我们的基因体时代-AI, Data和生物资讯 Day09-合成生物学与机器学习

上一篇我们的基因体时代-AI, Data和生物资讯 Day08-合成生物学与机器学习分享合成生物学领...

[Day13] 补充说明 – csrf

今天要来补充一下Day9 – views有说明到的csrf,虽然这些东西某某百科都有,那我会特别补充...

【day22】FCM云端通讯测试

各位如果没有关APP通知的时候,有时候我们就会收到来自APP的关怀,譬如说是有优惠活动,或是您的吴...

重温-基本&UI

创立一个属於自己的App,那就需要两个必须的部份,设备与知识。 自己所使用的设备为Apple Mac...

Day 29 / DL x RL / RL 总结与发展

RL 子系列到这边要告一段落了,整个系列文也接近尾声。RL 是个很有趣的主题,有很多内容可以介绍,但...