zoukankan      html  css  js  c++  java
  • 323. 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:

    Input: n = 5 and edges = [[0, 1], [1, 2], [3, 4]]
    
         0          3
         |          |
         1 --- 2    4 
    
    Output: 2
    

    Example 2:

    Input: n = 5 and edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
    
         0           4
         |           |
         1 --- 2 --- 3
    
    Output:  1

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    不知道线段怎么加

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    线段也是由点构成的,分成两个点来加

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    每次更新的都是roots数组,把新的root指定给roots数组中的元素

    //merge if neccessary
          if (root1 != root0) {
              roots[root1] = root0;
            count--;
          }

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    [复杂度]:Time complexity: O(1) Space complexity: O(n)

    [算法思想:迭代/递归/分治/贪心]:递归

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

     [潜台词] :

     

    class Solution {
      public int countComponents(int n, int[][] edges) {
        //use union find
        //ini
        int count = n;
        int[] roots = new int[n];
        
        //cc
        if (n == 0 || edges == null) return 0;
        
        //initialization the roots as themselves
        for (int i = 0; i < n; i++) 
          roots[i] = i;
        
        //add every edge
        for (int[] edge : edges) {
          int root0 = find(edge[0], roots);
          int root1 = find(edge[1], roots);
          
          //merge if neccessary
          if (root1 != root0) {
              roots[root1] = root0;
            count--;
          }
        }
        
        //return
        return count;
        
    }
      
      public int find(int id, int[] roots) {
        while (id != roots[id])
          id = roots[roots[id]];
        return id;
      }
    }
    View Code
  • 相关阅读:
    8.09_python_lx_shopping
    8.06_python_lx_day25
    8.05_python_lx_day24
    8.05_python_lx_day23
    8.03_python_lx_day21<2>
    Java注解
    Java多线程04
    Java多线程03
    Java多线程02
    Java多线程01
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9361387.html
Copyright © 2011-2022 走看看