• 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
  • 相关阅读:
    [Vue]axios的使用
    Handler和Thread线程
    Android启动时闪一下黑屏或者白屏
    WebP图片格式
    ThreadLocal
    泛化,实现,依赖,关联(聚合,组合)
    深入解析AsyncTask
    Processes and Application Life Cycle
    深拷贝浅拷贝
    LCS(Longest Common Subsequence)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9361387.html
Copyright © 2020-2023  润新知