• LeetCode 310. Minimum Height Trees


    原题链接在这里:https://leetcode.com/problems/minimum-height-trees/

    题目:

    For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write a function to find all the MHTs and return a list of their root labels.

    Format
    The graph contains n nodes which are labeled from 0 to n - 1. You will be given the number n and a list of undirected edges (each edge is a pair of labels).

    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.

    Example 1:

    Given n = 4edges = [[1, 0], [1, 2], [1, 3]]

            0
            |
            1
           / 
          2   3
    

    return [1]

    Example 2:

    Given n = 6edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]

         0  1  2
           | /
            3
            |
            4
            |
            5
    

    return [3, 4]

    题解:

    Course ScheduleCourse Schedule II类似。

    用BFS based topological sort. 从叶子节点开始放入queue中,最后剩下的一个或者两个就是最中心的点.

    这里练习undirected graph的topological sort. 用Map<Integer, Set<Integer>>来表示graph, 一条edge, 两头node都需要加graph中. 

    Time Complexity: O(n+e). Space: O(n+e).

    AC Java:

     1 class Solution {
     2     public List<Integer> findMinHeightTrees(int n, int[][] edges) {
     3         List<Integer> res = new ArrayList<Integer>();
     4         if(n == 1){
     5             res.add(0);
     6             return res;
     7         }
     8         
     9         if(n < 1 || edges == null || edges.length == 0){
    10             return res;
    11         }
    12         
    13         HashMap<Integer, HashSet<Integer>> graph = new HashMap<Integer, HashSet<Integer>>();
    14         for(int i = 0; i<n; i++){
    15             graph.put(i, new HashSet<Integer>());
    16         }
    17         
    18         for(int [] edge : edges){
    19             graph.get(edge[0]).add(edge[1]);
    20             graph.get(edge[1]).add(edge[0]);
    21         }
    22         
    23         LinkedList<Integer> que = new LinkedList<Integer>();
    24         for(Map.Entry<Integer, HashSet<Integer>> entry : graph.entrySet()){
    25             if(entry.getValue().size() == 1){
    26                 que.add(entry.getKey());
    27             }
    28         }
    29         
    30         while(n > 2){
    31             n -= que.size();
    32             LinkedList<Integer> temp = new LinkedList<Integer>();
    33             
    34             while(!que.isEmpty()){
    35                 int cur = que.poll();
    36                 for(int neigh : graph.get(cur)){
    37                     graph.get(cur).remove(neigh);
    38                     graph.get(neigh).remove(cur);
    39                     
    40                     if(graph.get(neigh).size() == 1){
    41                         temp.add(neigh);
    42                     }
    43                 }
    44             }
    45             
    46             que = temp;
    47         }
    48         
    49         res.addAll(que);
    50         return res;
    51     }
    52 }
  • 相关阅读:
    让WPF的Popup不总置顶的解决方案
    virtio 驱动的数据结构理解
    关于Linux下面msyql安装后并未设置初始密码,但是登录报错“Access denied for user 'root'@'localhost' (using password: NO)”的解决方案
    gulp初涉
    前后端分离--构建前端Mock Server--windows部署rap
    一些css小用法总结(持续更新~)
    js原生封装自定义滚动条
    ie下面兼容性问题的一些总结
    关于html水平垂直居中的一些总结吧
    C# 正则表达式匹配string字符串中的时间串(yyyyMMdd)
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/5301334.html
Copyright © 2020-2023  润新知