有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
示例 1:

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]] 输出:2
示例 2:

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]] 输出:3
提示:
1 <= n <= 200n == isConnected.lengthn == isConnected[i].lengthisConnected[i][j] 为 1 或 0isConnected[i][i] == 1isConnected[i][j] == isConnected[j][i]注意:本题与主站 547 题相同: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路一:dfs,挨个结点进行深搜,每有一个新的城市没有被visited,province++。
代码:
- class Solution {
- public int findCircleNum(int[][] isConnected) {
- boolean[] visited=new boolean[isConnected.length];
- int province=0;
- for(int i=0;i
- if(!visited[i]) {
- dfs(isConnected,visited,i);
- province++;
- }
- }
- return province;
- }
- public void dfs(int[][] isConnected,boolean[] visited,int i){
- for(int j=0;j
- if(isConnected[i][j]==1&&!visited[j]) {
- visited[j]=true;
- dfs(isConnected,visited,j);
- }
- }
- }
- }
思路二:并查集,find找当前结点的根节点,union来合并两个不同根的结点。注意合并时一定要合并当前结点的根节点而不是当前结点。
代码:
- class Solution {
- public int findCircleNum(int[][] isConnected) {
- int n=isConnected.length;
- int[] parent=new int[n];
- for(int i=0;i
- parent[i]=-1;
- for (int i = 0; i
- for (int j = i + 1; j
- if (isConnected[i][j] == 1)
- union(parent, i, j);
- }
- }
- int province=0;
- for(int i=0;i
- if(parent[i]==-1) province++;
- return province;
- }
- public int find(int[] parent,int x) {
- while(parent[x]>=0) x=parent[x];
- return x;
- }
- public void union(int[] parent,int x1,int x2) {
- int root1=find(parent,x1);
- int root2=find(parent,x2);
- if(root1==root2) return;
- parent[root2]=root1;
- }
- }
-
相关阅读:
[PAT练级笔记] 10 Basic Level 1012
边缘计算发生了什么?
java毕业设计Web产品管理系统源码+系统+数据库+lw文档+调试运行
2022/7/31
ChromeOptions 设置WebDriver/ChromeDriver的请求头参数
请求头Authorization
再见,Ubuntu,你好,Manjaro
【王道】数据结构与算法之排序算法(十一)
郁金香2021年游戏辅助技术中级班(七)
Linux下 gdb调试打印数组元素说明
-
原文地址:https://blog.csdn.net/Mar_mxs/article/details/134469320