【LeetCode75】第四十四题 省份数量

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

给我们一个二维数组,表示城市之间的连通情况,连在一起的城市为一个省份,问我们一共有多少个省份。

这是一道很经典很纯粹的并查集题目。按照我自己的话来说,并查集就是给将相连的元素都设置一个共同的源头,在本题中,我们让相连的城市都有一个共同的源头,那么最后我们统计一下所有城市一共有多少个不同的源头即可确定是有多少个城市了。

这代码就是很标准的并查集模板,大家记住并且理解即可。

首先我们需要定义一个长度和城市数量一样的数组,用来存放每个城市的源头。

并且需要将每个城市的源头初始化成自己。

接着遍历城市之间的连通情况。如果城市之间是连通的,那么我们需要将他们联系在一起,即把他们的源头改成同一个。

首先是先找出他们各自的源头,再把其中一个的源头的源头改成对方的源头。其中找出各自源头这一步是不断寻找源头列表里对应位置,如果一个城市的源头不是自己,那么我们就接着找这个城市的源头的源头,直到找到源头是自己的城市,那么这座城市就是我们需要寻找的城市的最终源头。

这对应了代码中的find函数。

记录完所有城市的连通情况之后,我们再看看所有城市一共有几个最终源头,将最终源头的数量返回出去即可。

代码:

cpp 复制代码
class Solution {
public:
    int find(int c,vector<int>& city){  //寻源
        if(c==city[c]) return c;    //自己就是源头,直接返回
        city[c]=find(city[c],city); //接着往上寻找源头
        return city[c]; 
    }
    void join(int i,int j,vector<int>& city){   //添加关系
        i=find(i,city);
        j=find(j,city);
        if(i==j) return;    //如果源头一样return
        city[i]=j;  //源头不一样就添加为一样,这边改成city[j]=i也是可以的
    }
    int findCircleNum(vector<vector<int>>& isConnected) {
        vector<int>city(isConnected.size());    //用来记录每个城市的源头
        for(int i=0;i<isConnected.size();i++) city[i]=i;    //初始化成每个城市都是自己的源头

        for(int i=0;i<isConnected.size();i++){
            for(int j=0;j<isConnected.size();j++){
                if(isConnected[i][j]==1) join(i,j,city);    //如果城市间是相连的,则添加关系为源头一致
            }
        }

        //统计所有城市一共有多少个源头
        unordered_set<int>res;
        for(int& c:city){
            res.insert(find(c,city));
        }
        return res.size();
    }
};
相关推荐
小龙报4 分钟前
《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 1.移动零,2.颜色分类
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
再睡一夏就好16 分钟前
【C++闯关笔记】使用红黑树简单模拟实现map与set
java·c语言·数据结构·c++·笔记·语法·1024程序员节
im_AMBER21 分钟前
Leetcode 43
笔记·学习·算法·leetcode
ceffans31 分钟前
PDF文档中表格以及形状解析-后续处理(线段生成最小多边形)
c++·windows·算法·pdf
mifengxing1 小时前
力扣每日一题——接雨水
c语言·数据结构·算法·leetcode·动态规划·
魔云连洲2 小时前
前端树形结构过滤算法
前端·算法
小龙报2 小时前
《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
序属秋秋秋2 小时前
《Linux系统编程之开发工具》【编译器 + 自动化构建器】
linux·运维·服务器·c语言·c++·自动化·编译器
夏玉林的学习之路3 小时前
正则表达式
数据库·c++·qt·mysql·正则表达式
小南家的青蛙3 小时前
LeetCode LCR 085 括号生成
算法·leetcode·职场和发展