zoukankan      html  css  js  c++  java
  • 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 GraphNumber of Islands II.

  • 相关阅读:
    python进阶学习chapter04(字符串相关)
    python进阶学习chapter03(迭代相关)
    python学习笔记之collections模块的使用
    python进阶学习chapter02(列表、字典、集合操作)
    python接口测试之json模块的使用
    python接口测试之如何发送邮件
    python接口测试之如何操作excel
    python unittest库的入门学习
    python requests库学习笔记
    重建二叉树*
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5247187.html
Copyright © 2011-2022 走看看