Leetcode: Minimum Height Trees
2016-01-01 02:39
411 查看
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? Answer: 1 or 2
build graph first, also buil indegree array, then find leaf and remove them among their neighbors, level by level. Until left less 2 nodes
public class Solution { public List<Integer> findMinHeightTrees(int n, int[][] edges) { List<Integer> leaves = new ArrayList<Integer>(); if (edges==null || edges.length==0) { leaves.add(n-1); return leaves; } HashMap<Integer, ArrayList<Integer>> graph = new HashMap<Integer, ArrayList<Integer>>(); int[] indegree = new int ; for (int i=0; i<n; i++) { graph.put(i, new ArrayList<Integer>()); } //build the graph for (int[] edge : edges) { graph.get(edge[0]).add(edge[1]); graph.get(edge[1]).add(edge[0]); indegree[edge[0]]++; indegree[edge[1]]++; } //find the leaves for (int i=0; i<n; i++) { if (indegree[i] == 1) { leaves.add(i); } } //topological sort until n<=2 while (n > 2) { List<Integer> newLeaf = new ArrayList<Integer>(); for (Integer leaf : leaves) { List<Integer> neighbors = graph.get(leaf); for (Integer neighbor : neighbors) { indegree[neighbor]--; graph.get(neighbor).remove(leaf); if (indegree[neighbor] == 1) newLeaf.add(neighbor); } //delete leaf from graph indegree[leaf]--; neighbors.clear(); n--; } leaves = newLeaf; } return leaves; } }
相关文章推荐
- 双系统的一些问题。
- MFC 用 Direct2D 显示图像到 Picture Control 中
- 2016新年总结
- 2016依然做一个偏执顽固的程序猿
- uva 10038 - Jolly Jumpers
- lnmp快速搭建
- ubuntu强制安装32位包库
- Android AutoLayout全新的适配方式 堪称适配终结者
- 解决linux 命令行乱码
- python实现onvif协议-1
- typedef
- 记录4种解析xml字符串的方法
- druid 数据库密码加密
- C 语言字符测试函数的用法举例 - 2016.01.01
- bzoj2141: 排队
- JTA介绍
- 中国云计算
- 文章标题
- 第九次Scrum meeting
- 今天我来整理下自己开发CM完成第一个项目HTC a5 的编译过程