leetcode@ [310] 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 = 4, edges = [[1, 0], [1, 2], [1, 3]]
0
|
1
/ \
2 3
return [1]
Example 2:
Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
0 1 2
\ | /
3
|
4
|
5
return [3, 4]
Hint:
- How many MHTs can a graph have at most?
Note:
(1) According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
(2) The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.
public class Solution {
/** return the height of tree if let s to be the root of the tree */
public static int bfs(ArrayList<ArrayList<Integer> > g, int s) {
HashSet<Integer> upper = new HashSet<Integer> ();
HashSet<Integer> lower = new HashSet<Integer> ();
HashSet<Integer> vis = new HashSet<Integer> ();
upper.add(s);
vis.add(s);
int lv = 1;
while(!upper.isEmpty()) {
for(int u: upper) {
ArrayList<Integer> adj = g.get(u);
for(int i=0; i<adj.size(); ++i) {
int adj_node = adj.get(i);
if(!vis.contains(adj_node)) {
lower.add(adj_node);
}
}
}
if(!lower.isEmpty()) {
++lv;
}
upper.clear();
for(int c: lower) {
vis.add(c);
upper.add(c);
}
lower.clear();
}
return lv;
}
public static ArrayList<Integer> topologicalSort(int n, int[][] edges, ArrayList<ArrayList<Integer> > g) {
ArrayList<Integer> topo = new ArrayList<Integer> ();
int[] d = new int[n];
for(int i=0; i<edges.length; ++i) {
int u = edges[i][0], v = edges[i][1];
++d[u]; ++d[v];
}
LinkedList<Integer> queue = new LinkedList<Integer> ();
for(int i=0; i<n; ++i) {
if(d[i] == 1) {
queue.addLast(i);
}
}
while(!queue.isEmpty()) {
int top = queue.pollFirst();
topo.add(top);
ArrayList<Integer> adj = g.get(top);
for(int next: adj) {
d[next]--;
if(d[next] == 1) {
queue.addLast(next);
}
}
}
return topo;
}
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> rs = new ArrayList<Integer> ();
if(n == 1) {
rs.add(0);
return rs;
}
ArrayList<ArrayList<Integer> > g = new ArrayList<ArrayList<Integer> > ();
for(int i=0; i<n; ++i) {
ArrayList<Integer> row = new ArrayList<Integer> ();
g.add(row);
}
for(int i=0; i<edges.length; ++i) {
int u = edges[i][0];
int v = edges[i][1];
g.get(u).add(v);
g.get(v).add(u);
}
HashMap<Integer, Integer> mapping = new HashMap<Integer, Integer> ();
ArrayList<Integer> topo = topologicalSort(n, edges, g);
int idx = topo.get(topo.size()-1);
int min_lv = bfs(g, idx);
rs.add(idx);
if(topo.size() >= 2) {
int indice = topo.get(topo.size()-2);
if(bfs(g, indice) == min_lv) {
rs.add(indice);
}
}
return rs;
}
}
leetcode@ [310] Minimum Height Trees的更多相关文章
- [LeetCode] 310. Minimum Height Trees 解题思路
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] 310. Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- 【LeetCode】310. Minimum Height Trees 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 相似题目 参考资料 日期 题目地址:http ...
- 310. Minimum Height Trees
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] 310. Minimum Height Trees_Medium tag: BFS
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- 310. Minimum Height Trees -- 找出无向图中以哪些节点为根,树的深度最小
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- LeetCode Minimum Height Trees
原题链接在这里:https://leetcode.com/problems/minimum-height-trees/ 题目: For a undirected graph with tree cha ...
- Minimum Height Trees -- LeetCode
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
随机推荐
- C++:this指针
this指针 this关键字:表示本类中的对象成员,可以通过this指针访问当前类的成员//举例 //例 3.18 隐藏this指针的引例 #include<iostream> using ...
- Map集合案例
1.获取字符串中每一个字母出现的次数. 比如"aababcabcdabcde",结果为:a(5)b(4)c(3)d(2)e(1) 分析如下: package mapexercise ...
- jps
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- PCA understanding
PCA understanding 我们希望获取玩具的位置,事实上我们只需要知道玩具在x轴的位置就可以了(但现实不知道).我们利用三个坐标轴,获取了2*3维度的数据,现实中我们如何通过分析六维度数据来 ...
- [Mongo] error inserting documents: BSONObj size is invalid (mongoimport mongorestore 数据备份恢复)
解决办法如下, ./mongoimport -port 6066 -d xxx -c xxx --batchSize=10 /root/mong_data/test/xxx 原因转自 http://b ...
- 高性能Web框架Zend Framework
Zend Framework (ZF)是用 PHP 5.3及更高版本来开发 Web 程序和服务的开源框架.ZF用100% 面向对象编码实现. ZF的组件结构独一无二,每个组件几乎不依靠其他组件.这样的 ...
- 【转载】Java垃圾回收内存清理相关(虚拟机书第三章),GC日志的理解,CPU时间、墙钟时间的介绍
主要看<深入理解Java虚拟机> 第三张 P84 开始是垃圾收集相关. 1. 1960年诞生于MIT的Lisp是第一门采用垃圾回收的语言. 2. 程序计数器.虚拟机栈.本地方法栈3个区域随 ...
- 8 种 NoSQL 数据库系统对比
导读:Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型NoSQL数据库的文章. 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只 ...
- dynamic_cast,const_cast,static_cast,reinterpret_cast 详解
如果直接指针直接强转,将只能访问虚函数的内容,而不能访问特定类中的特定成员或方法!!!! 强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,stat ...
- Java [leetcode 1] Two Sum
小二终于开通博客了,真是高兴.最近在看Java,所以就拿leetcode练练手了.以后我会将自己解体过程中的思路写下来,分享给大家,其中有我自己原创的部分,也有参考别人的代码加入自己理解的部分,希望大 ...