LeetCode 323. Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
题目:
Given n
nodes labeled from 0
to n - 1
and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.
Example 1:
0 3 | | 1 --- 2 4
Given n = 5
and edges = [[0, 1], [1, 2], [3, 4]]
, return 2
.
Example 2:
0 4 | | 1 --- 2 --- 3
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
, return 1
.
Note:
You can assume that no duplicate edges will appear in edges
. Since all edges are undirected, [0, 1]
is the same as [1, 0]
and thus will not appear together in edges
.
题解:
使用一维UnionFind.
Time Complexity: O(elogn). e是edges数目. Find, O(logn). Union, O(1).
Space: O(n).
AC Java:
1 class Solution { 2 public int countComponents(int n, int[][] edges) { 3 if(n <= 0){ 4 return 0; 5 } 6 7 UnionFind uf = new UnionFind(n); 8 for(int [] edge : edges){ 9 if(!uf.find(edge[0], edge[1])){ 10 uf.union(edge[0], edge[1]); 11 } 12 } 13 14 return uf.size(); 15 } 16 } 17 18 class UnionFind{ 19 private int count; 20 private int [] parent; 21 private int [] size; 22 23 public UnionFind(int n){ 24 this.count = n; 25 parent = new int[n]; 26 size = new int[n]; 27 for(int i = 0; i<n; i++){ 28 parent[i] = i; 29 size[i] = 1; 30 } 31 } 32 33 public boolean find(int i, int j){ 34 return root(i) == root(j); 35 } 36 37 private int root(int i){ 38 while(i != parent[i]){ 39 parent[i] = parent[parent[i]]; 40 i = parent[i]; 41 } 42 43 return parent[i]; 44 } 45 46 public void union(int i, int j){ 47 int rootI = root(i); 48 int rootJ = root(j); 49 if(size[rootI] > size[rootJ]){ 50 parent[rootJ] = rootI; 51 size[rootI] += size[j]; 52 }else{ 53 parent[rootI] = rootJ; 54 size[rootJ] += size[rootI]; 55 } 56 57 this.count--; 58 } 59 60 public int size(){ 61 return this.count; 62 } 63 }
也可以使用BFS, DFS.
Time Complexity: O(n+e), 建graph用O(n+e), BFS, DFS 用 O(n+e). Space: O(n + e).
1 public class Solution { 2 public int countComponents(int n, int[][] edges) { 3 List<List<Integer>> graph = new ArrayList<List<Integer>>(); 4 for(int i = 0; i<n; i++){ 5 graph.add(new ArrayList<Integer>()); 6 } 7 8 for(int [] edge : edges){ 9 graph.get(edge[0]).add(edge[1]); 10 graph.get(edge[1]).add(edge[0]); 11 } 12 13 HashSet<Integer> visited = new HashSet<Integer>(); 14 int count = 0; 15 for(int i = 0; i<n; i++){ 16 if(!visited.contains(i)){ 17 // bfs(graph, i, visited); 18 dfs(graph, i, visited); 19 count++; 20 } 21 } 22 return count; 23 } 24 25 public void bfs(List<List<Integer>> graph, int i, HashSet<Integer> visited){ 26 LinkedList<Integer> que = new LinkedList<Integer>(); 27 visited.add(i); 28 que.add(i); 29 while(!que.isEmpty()){ 30 int cur = que.poll(); 31 List<Integer> neighbours = graph.get(cur); 32 for(int neighbour : neighbours){ 33 if(!visited.contains(neighbour)){ 34 que.add(neighbour); 35 visited.add(neighbour); 36 } 37 } 38 } 39 } 40 41 public void dfs(List<List<Integer>> graph, int i, HashSet<Integer> visited){ 42 visited.add(i); 43 for(int neighbour : graph.get(i)){ 44 if(!visited.contains(neighbour)){ 45 dfs(graph, neighbour, visited); 46 } 47 } 48 } 49 }
跟上Find the Weak Connected Component in the Directed Graph, Number of Islands II.