并查集(UnionFind) 系列
2021/11/21 6:09:51
本文主要是介绍并查集(UnionFind) 系列,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
547. Number of Provinces
MediumThere are n
cities. Some of them are connected, while some are not. If city a
is connected directly with city b
, and city b
is connected directly with city c
, then city a
is connected indirectly with city c
.
A province is a group of directly or indirectly connected cities and no other cities outside of the group.
You are given an n x n
matrix isConnected
where isConnected[i][j] = 1
if the ith
city and the jth
city are directly connected, and isConnected[i][j] = 0
otherwise.
Return the total number of provinces.
Example 1:
Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]] Output: 2
Example 2:
Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]] Output: 3
Constraints:
1 <= n <= 200
n == isConnected.length
n == isConnected[i].length
isConnected[i][j]
is1
or0
.isConnected[i][i] == 1
isConnected[i][j] == isConnected[j][i]
解法1: 并查集
class Solution { public int findCircleNum(int[][] isConnected) { //1.for loop len elements do unionfind UnionFind uf = new UnionFind(isConnected.length); for(int i=0;i<isConnected.length;i++){ for(int j=0;j<isConnected.length;j++){ if(i!=j && isConnected[i][j]==1) { uf.union(i,j); } } } //2.count the parent[i]=i int count = 0; for(int i=0;i<isConnected.length;i++) if(uf.parent[i]==i) count++; return count; } //UnionFind implementation class UnionFind{ int[] parent; int[] rank; UnionFind(int n){ parent = new int[n]; rank = new int[n]; for(int i=0;i<n;i++) parent[i]=i; } public int findParent(int x){ if(x==parent[x]) return x; parent[x] = findParent(parent[x]); return parent[x]; } public void union( int x,int y ){ int px = findParent(x); int py = findParent(y); if(px==py) return; if(rank[px]>rank[py]) parent[py]=px; else if(rank[px]<rank[py]) parent[px]=py; else{ parent[px]=py; rank[py]++; } } } }
解法二: dfs
class Solution { public int findCircleNum(int[][] isConnected) { //defind visited int len = isConnected.length; boolean[] visited = new boolean[len]; //for loop 0 ~ len-1 recursively find its connections int count = 0; for(int i=0;i<len;i++){ if(visited[i]) continue; count++; dfs(isConnected,i,visited); } return count; } private void dfs(int[][] isConnected,int i,boolean[] visited){ int len = isConnected.length; visited[i]=true; for(int j=0;j<len;j++){ if(isConnected[i][j]==1 && !visited[j] ) dfs(isConnected,j,visited); } } }
这篇关于并查集(UnionFind) 系列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南