有 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 <=200
n == isConnected.length
n == isConnected[i].length
isConnected[i][j] 为 1 或 0
isConnected[i][i]==1
isConnected[i][j]== isConnected[j][i]
连通域问题
1. DFS
classSolution{publicintfindCircleNum(int[][] isConnected){int n = isConnected.length;//城市数量boolean[] visited =newboolean[n];//默认值位=为falseint count =0;//省份数量//1.dfsfor(int i =0; i < n; i++){if(!visited[i]){//没有被访问过,说明是一个新的省份
count++;dfs(i, isConnected, visited);}}return count;}publicvoiddfs(int index,int[][] isConnected,boolean[] visited){
visited[index]=true;//标记为已访问for(int i =0; i < visited.length; i++){//如果下一个城市与当前城市联通并且没被访问过,如果访问过了就不用再递归去做标记了,否则无法结束递归//eg:A-B-C-A联通。会相当于一个环,没有!visited[i]限制的话会一直递归下去if(isConnected[index][i]==1&&!visited[i]){dfs(i, isConnected, visited);}}}}
BFS
classSolution{publicintfindCircleNum(int[][] isConnected){int n = isConnected.length;//城市数量boolean[] visited =newboolean[n];//默认值位=为falseint count =0;//省份数量//2.bfsQueue<Integer> queue =newLinkedList<>();for(int i =0; i < n ;i++){if(!visited[i]){
count++;
queue.offer(i);
visited[i]=true;}//遍历标记当前连通域while(!queue.isEmpty()){int cur = queue.poll();for(int j =0; j < n; j++){if(isConnected[cur][j]==1&&!visited[j]){
queue.offer(j);
visited[j]=true;}}}}return count;}}
并查集
classSolution{publicintfindCircleNum(int[][] isConnected){int n = isConnected.length;//城市数量boolean[] visited =newboolean[n];//默认值位=为falseint count =0;//省份数量//3.并查集Union provinces =newUnion(n);for(int i =0; i < n; i++){for(int j =0; j < n; j++){if(isConnected[i][j]==1){//联通证明需要合并
provinces.union(i, j);}}}return provinces.size;//返回最后剩下的省份数;}publicvoiddfs(int index,int[][] isConnected,boolean[] visited){
visited[index]=true;//标记为已访问for(int i =0; i < visited.length; i++){//如果下一个城市与当前城市联通并且没被访问过,如果访问过了就不用再递归去做标记了,否则无法结束递归//eg:A-B-C-A联通。会相当于一个环,没有!visited[i]限制的话会一直递归下去if(isConnected[index][i]==1&&!visited[i]){dfs(i, isConnected, visited);}}}}classUnion{int[] pre;int size;//初始化为城市数量,认为各占一个省份publicUnion(int n){
pre =newint[n];for(int i =0; i < n; i++){
pre[i]= i;}
size = n;}//查+路径压缩publicintfind(int x){int r = x;while(pre[r]!= r){
r = pre[r];}//路径压缩,从下网上添至根节点int i = x, j;while(i != r){
j = pre[i];//先把之前的上一级记录下来
pre[i]= r;
i = j;}return r;}//合并publicvoidunion(int x ,int y){int rx =find(x);int ry =find(y);if(rx != ry){//不在同一个省份才需要合并
pre[rx]= ry;
size--;//既然合并了,省份就少了一个 }}}
LeetCode 547 省份数量 题解有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。