310. Minimum Height Trees

输入:包含n个节点的无向图。n:表示从0到n-1,n个节点。edges:int数组,是从一个节点到另外一个节点。但是没有方向。
输出:以哪些节点为根节点,具有最小高度的树,返回这些根节点。
规则:一个树的高度是指从根节点到叶子节点的最远路径。最小高度树,是指所有树中高度最小的树。
分析:当只有一个节点的时候,只要返回节点0就可以。
在这里插入图片描述
 当有两个节点且相连的时候,哪个节点做根节点,树的高度都相同。
 在这里插入图片描述
 当有3个节点的时候,node1和node3肯定不能为根节点,因为以node2为根,高度是1;而以node1或者node3高度为2。也就是说当有3个或者以上节点的时候,使用叶子节点做根节点的树肯定不符合要求。假设叶子节点nodeA为根是高度最小树,那么nodeA肯定有子节点还有其他节点,否则一棵树不能包含所有节点。那么以nodeA的子节点为根,高度减1,与假设不符合。有了这个结论:使用叶子节点做根节点的树肯定不符合要求。(这个观点的来源)我们就可以使用动态规划的思路来不断解决更小的问题。
 在这里插入图片描述
 例如上图5个节点的图,node4,node5不是根节点,那谁是呢?把node4,node5从图中移除,只剩下node1,node2,node3,3个节点。
 在这里插入图片描述
 在这3个节点的图中,node1,node3肯定不是根节点。将这两个节点从图中移除。就只有node2。也就是说node2是根节点。
 在这个问题规模不断变小的过程中,不断去掉叶子节点。而这个操作不影响原有问题的答案。

public List<Integer> findMinHeightTrees(int n, int[][] edges) {Map<Integer,List<Integer>> graph = createGraph(edges,n);int[] inDegrees = new int[n];for(int[] edge : edges){inDegrees[edge[0]]++;inDegrees[edge[1]]++;}List<Integer> result = new ArrayList<Integer>();Queue<Integer> queue = new LinkedList<Integer>();for(int i=0;i<n;i++){if(inDegrees[i]==0){result.add(i);return result;}else if(inDegrees[i]==1){queue.offer(i);}}while(!queue.isEmpty()){result = new ArrayList<Integer>();int size = queue.size();for(int i=0;i<size;i++){int node = queue.poll();result.add(node);for(Integer toNode : graph.get(node)){inDegrees[toNode]--;if(inDegrees[toNode]==1){queue.offer(toNode);}}}}return result;}private Map<Integer,List<Integer>> createGraph(int[][] edges,int n){Map<Integer,List<Integer>> graph = new HashMap<Integer,List<Integer>>();for(int i=0;i<n;i++){graph.put(i,new ArrayList<Integer>());}for(int[] edge : edges){graph.get(edge[0]).add(edge[1]);graph.get(edge[1]).add(edge[0]);}return graph;}

分析2:分别以每个节点作为根节点计算树的高度,在这个过程中比较记录最小高度minHeight。遍历之前的结果,等于minHeight的节点加入到结果集中。
 在计算树的高度的过程中,可以使用动态规划的想法。假设已知 A 的所有相邻节点分别为树根的各个子树的树高,那么 A根的树高等于 已知的各个子树树高中的最大值 加一。方程式表达如下,即状态转换方程:
height(A) = max(height(A.next0), height(A.next2),… height(A.nextk)) + 1(来源网址)
在计算过程中需要记录各个子树的高度,避免重复计算。缓存的key值是“当前节点->子节点”。

private Map<String,Integer> cache = new HashMap<String,Integer>();public List<Integer> findMinHeightTrees(int n, int[][] edges) {Map<Integer,List<Integer>> graph = createGraph(edges,n);int[] heights = new int[n];int minHeight = n;for(int i=0;i<n;i++){heights[i] = findHeight(graph,i,-1);minHeight = Math.min(minHeight,heights[i]);}List<Integer> result = new ArrayList<Integer>();for(int i=0;i<n;i++){if(heights[i]==minHeight){result.add(i);}}return result;}private int findHeight(Map<Integer,List<Integer>> graph,int root,int parent){int height = 0;for(Integer toNode : graph.get(root)){if(toNode==parent){continue;}String key = String.valueOf(root)+"->"+toNode;int tmp;if(cache.get(key)!=null){tmp = cache.get(key);}else{tmp = findHeight(graph,toNode,root);cache.put(key,tmp);}height = Math.max(height,tmp);}return height+1;}private Map<Integer,List<Integer>> createGraph(int[][] edges,int n){Map<Integer,List<Integer>> graph = new HashMap<Integer,List<Integer>>();for(int i=0;i<n;i++){graph.put(i,new ArrayList<Integer>());}for(int[] edge : edges){graph.get(edge[0]).add(edge[1]);graph.get(edge[1]).add(edge[0]);}return graph;}

代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算获取最小值和最大值

比如&#xff0c;在下面的销售业绩中&#xff0c;统计业务员的销售业绩中最大值和最小值。 下面是业务数据&#xff1a; CREATE TABLE [dbo].[SalesPerformance]([ID] [int] IDENTITY(1,1) NOT NULL,[Salesman] NVARCHAR(30) NOT NULL,[OrderDate] [DATE] NULL,[Sell] DECIM…

第二十五期:知乎用Go替代Python,说明了啥

众所周知&#xff0c;知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎&#xff0c;一部分人就说 Go 比 Python 好&#xff0c;Go 和 Python 两大社区的相关开发人员为此也争论过不少&#xff0c;似乎&#xff0c;谁也没完全说服谁。 作者&#xff1a;hello架构 大概每…

[Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {int inLen inorder.length;int postLen postorder.length;// 特判if (inLen ! postLen) {throw new RuntimeException("输入错误");}return …

第二十六期:英国建设下一代IOT基础设施的历史机遇和挑战

无论未来物联网发展的中心在哪里&#xff0c;都会带来一笔巨大的财富。但许多地区面临的真正障碍是缺乏可用的光纤基础设施来形成回程网络。接下来看一看全光纤在英国的推广情况。 作者&#xff1a;风车云马编译 世界各地的市政当局都在呼吁制定支持5G的基础设施计划。这些基…

[Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] post) {if(prenull || pre.length0) {return null;}return dfs(pre,post);}private TreeNode dfs(int[] pre,int[] post) {if(prenull || pre.length0)…

第二十七期:Deepfake视频正在快速传播,也许区块链能够阻止这波“瘟疫”

“假新闻”一词已经成为当下的热门话题&#xff0c;而Deepfake(即看似真实&#xff0c;但实为伪造的视频操纵行为)则会进一步加剧民众与媒体之间的不信任危机。 作者&#xff1a;佚名来源 “假新闻”一词已经成为当下的热门话题&#xff0c;而Deepfake(即看似真实&#xff0c;…

POJ 1276 完全背包

Sample Input 735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10 Sample Output 735 630 0 0题意&#xff1a;你的银行卡里有 cash 元&#xff0c;而ATM机里有 n 种面值的钱&#xff0c;n行每种钱的数量和面值。  问 最多能从这台AT…

[Leetcode][第117题][JAVA][填充每个节点的下一个右侧节点指针][BFS]

【问题描述】[中等] 【解答思路】 1. 层次遍历 public Node connect(Node root) {if (root null)return root;Queue<Node> queue new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {//每一层的数量int levelCount queue.size();//前一个节点Node …

第二十八期:Java线程池的四种用法与使用场景

线程池的作用主要是为了提升系统的性能以及使用率。文章刚开始就提到&#xff0c;如果我们使用最简单的方式创建线程&#xff0c;如果用户量比较大&#xff0c;那么就会产生很多创建和销毁线程的动作&#xff0c;这会导致服务器在创建和销毁线程上消耗的性能可能要比处理实际业…

php连接mysql遇到的问题: (HY000/1130) 和 [caching_sha2_password]

说明一下我的mysql是安装在虚拟机上的 所以遇到的第一个问题就是访问问题 解决&#xff1a; update user set host % where user root; 重启mysql服务 试了很多方法&#xff0c;也找了很多方法只有这个可行。 问题2&#xff0c; 解决&#xff1a; https://www.cnblogs.com/un…

847. Shortest Path Visiting All Nodes(一)

输入&#xff1a;一个无向图&#xff0c;各个节点的标签是0、1、2…N-1。graph[i][j]表示从节点i到节点j有一条边。 输出&#xff1a;返回每个节点都访问一遍需要的最少步骤。 规则&#xff1a;各个节点可以重复访问。 分析&#xff1a;  如果可以知道从每个节点开始&#xf…

第二十九期:程序员们该如何破局!

我是实打实的程序员一枚&#xff0c;身为一个过来人&#xff0c;我觉得有必要说几点针对程序员们的破局思维&#xff0c;希望能解决不少人的迷茫与困惑。 作者&#xff1a;stormzhang 新读者可能不知道&#xff0c;老读者都晓得&#xff0c;虽说现在转身做了自媒体&#xff0c…

[Leetcode][第75题][JAVA][颜色分类][双(三)指针][计数排序]

【问题描述】[中等] 【解答思路】 1. 三指针 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public void sortColors(int[] nums) {int n nums.length;int p0 0, p2 n - 1;for (int i 0; i < p2; i) {while (i < p2 && nums[i] …

第三十期:程序员报告:男性占比超87% 北京月薪12184元最高

1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%。 作者&#xff1a;朝晖 1024“程序员节”&#xff0c;58同城招聘研究院发布程序员行业大数据报告显示&#xff0c;程序员男性占比高达87.29%&#xff0c;北…

[Leetcode][LCP 19][JAVA][秋叶收藏集][动态规划]

【问题描述】[中等] 【解答思路】 1. 动态规划 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public int minimumOperations(String leaves) {if (leaves null || leaves "") { // 排除 不合法参数情况return 0;}int length leave…

第三十一期:QQ for Linux 复活,微信 for Linux 还远吗?

网友通过分析龙芯处理器的生态支持计划与近期 QQ for Linux 支持 MIPS 架构的事实&#xff0c;结合当前国产自主研发的大背景&#xff0c;认为距离微信 for Linux 的发布也不远了。 10 月 24 日晚间&#xff0c;腾讯突然发布了沉寂多年的 QQ for Linux 新版本&#xff0c;引起了…

[Leetcode][第141、142题][JAVA][环形链表][哈希表][快慢指针][数学推理]

【问题描述】[中等] 【解答思路】 141 每次遍历到一个节点时&#xff0c;判断该节点此前是否被访问过。 具体地&#xff0c;我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点&#xff0c;如果该节点已经存在于哈希表中&#xff0c;则说明该链表是环形链…

样式集合

box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3);转载于:https://www.cnblogs.com/xmyd/p/10943567.html

[Leetcode][第1002题][JAVA][查找常用字符][计数][HashMap]

【问题描述】[简单] 【解答思路】 计数法 1. minfreq存放最终重复字母的个数 freq存放每次遍历字符串的字母个数 2. minfreq初始化最大值&#xff0c;每遍历一个字符串后&#xff0c;比较minfreq[i]、freq[i]的大小&#xff0c;minfreq[i]更新为两者的最小值。 3. 根据minf…

第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

说来惭愧&#xff0c;从事互联网开发好些年了&#xff0c;有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈&#xff0c;发现很多都讲的含含糊糊的。 作者&#xff1a;资深开发讲技术 背景 …