LeetCode 0310.最小高度树:拓扑排序秒了

【LetMeFly】310.最小高度树:拓扑排序秒了

力扣题目链接:https://leetcode.cn/problems/minimum-height-trees/

树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。

给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 aibi 之间存在一条无向边。

可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高度树

请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。

树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。

 

示例 1:

输入:n = 4, edges = [[1,0],[1,2],[1,3]]
输出:[1]
解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。

示例 2:

输入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]
输出:[3,4]

 

    提示:

    • 1 <= n <= 2 * 104
    • edges.length == n - 1
    • 0 <= ai, bi < n
    • ai != bi
    • 所有 (ai, bi) 互不相同
    • 给定的输入 保证 是一棵树,并且 不会有重复的边

    方法一:拓扑排序

    根据图论我们知道,(非空)树的中心有一个或两个。

    原因小提示:

    树中最长路的中心有一个或两个。

    那么,我们来个拓扑排序不就好了?

    从叶节点开始“扔”,每次扔掉所有的叶节点节点。这样就会出现新的叶节点,再扔掉。…。一层一层,直到某层扔完时剩下一个或两个节点即为答案。

    拓扑排序怎么实现:

    使用一个数组degreedegree[i]表示与节点i相邻的边有几条,图论中称其为

    初始时将所有度为1的节点入队。

    每次将这一层的所有节点出队,对于出队的节点thisNode,它的所有相邻的节点的度减一。若度变成了1,则入队(新的叶节点get)。

    • 时间复杂度 O ( n ) O(n) O(n)
    • 空间复杂度 O ( n ) O(n) O(n)

    AC代码

    C++
    class Solution {
    public:vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {if (n == 1) {  // 这里不要忘了!要不然degree不为1return {0};}vector<int> degree(n);vector<vector<int>> graph(n);for (vector<int>& v : edges) {degree[v[0]]++;degree[v[1]]++;graph[v[0]].push_back(v[1]);graph[v[1]].push_back(v[0]);}queue<int> q;for (int i = 0; i < n; i++) {if (degree[i] == 1) {q.push(i);}}int remainNode = n;while (remainNode > 2) {for (int _ = q.size(); _ > 0; _--) {remainNode--;int thisNode = q.front();q.pop();for (int nextNode : graph[thisNode]) {degree[nextNode]--;if (degree[nextNode] == 1) {q.push(nextNode);}}}}vector<int> ans = {q.front()};q.pop();if (q.size()) {ans.push_back(q.front());}return ans;}
    };
    
    Python
    from typing import Listclass Solution:def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:if n == 1:return [0]degree = [0] * ngraph = [[] for _ in range(n)]for x, y in edges:degree[x] += 1degree[y] += 1graph[x].append(y)graph[y].append(x)q = [i for i, d in enumerate(degree) if d == 1]remainNode = nwhile remainNode > 2:tempQ = []for thisNode in q:remainNode -= 1for nextNode in graph[thisNode]:degree[nextNode] -= 1if degree[nextNode] == 1:tempQ.append(nextNode)q = tempQreturn q
    

    同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/136790299

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

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

    相关文章

    代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

    104.二叉树最大深度 深度和高度 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取决于深度从0开始还是从1开始&#xff09;二叉树节点的高度&#xff1a;指从该节点到叶子节点的最长简单路径边的条数或者节点数&#xff08;取…

    【OpenVINO】解决OpenVINO在GPU推理中报错的方法

    1. 问题描述 使用OpenVINO进行深度学习推理时&#xff0c;通常会借助GPU以提升计算速度。然而&#xff0c;有时候运行程序时候会出现如下错误&#xff1a; <kernel>:8153:2: error: expected identifier or (unroll_for (int i 0; i < TILE_SIZE; i) {^ <kernel…

    rk3568 安卓11双屏异显,隐藏副屏的导航栏

    rk3568 安卓11双屏异显&#xff0c;当前项目有两个屏&#xff0c;一个是mipi 接口设为主屏&#xff0c;一个rgb 接口设为副屏&#xff0c;现在需要将副屏底部虚拟导航栏隐藏&#xff0c;有快速的方法&#xff1a; 在framework/base/services/core/java/com/android/server/wm/D…

    Linux学习:git补充与调试工具gdb

    目录 1. git版本控制器&#xff08;续&#xff09;1.1 git本地仓库结构1.2 git实现版本控制与多人协作的方式1.3 git相关指令&#xff0c;多分支模型与.gitignore文件 2. gdb调试工具2.1 企业项目开发流程简述与调试的必要性2.2 bug的调试思路方法与调式工具的使用 1. git版本控…

    软考高级:特定领域软件架构(DSSA)概念和例题

    作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

    P3378 【模板】堆

    题目描述 给定一个数列&#xff0c;初始为空&#xff0c;请支持下面三种操作&#xff1a; 给定一个整数 x&#xff0c;请将 x 加入到数列中。输出数列中最小的数。删除数列中最小的数&#xff08;如果有多个数最小&#xff0c;只删除 1 个&#xff09;。 输入格式 第一行是一个…

    linux网络固定ip的方式

    1. 注意 默认情况下&#xff0c;我们linux操作系统 ip 获取的方式是自动获取的方式&#xff08;DHCP&#xff09;&#xff0c;自动获取在我们需要进行集群配置的时候&#xff0c;IP会经常变化&#xff0c;需要将IP固定下来。 2. 第一步 编辑我们 linux 的网卡文件 这个网卡文件…

    03. Java 的流程控制

    三种基本结构 顺序结构、循环结构和选择结构是程序设计中常见的三种基本结构&#xff0c;它们共同构建了程序的执行流程&#xff1a; 顺序结构&#xff1a;就像一条直线&#xff0c;代码按照从上到下的顺序依次执行&#xff0c;一个步骤接着一个步骤。这种结构简单直接&#…

    JSON 数据(就是字符串)格式的转换

    1.JSON 的介绍&#xff1a;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本格式来表示结构化数据。JSON常用于前后端之间的数据传输和存储。 JSON的主要作用有以下几点&#xff1a; 1> 数据交换&a…

    环境变量配置

    举一个小例子来演示一下环境变量配置。 在CMD中打开QQ界面&#xff0c;首先需要知道QQ.exe文件的完整路径。一旦有了这个路径&#xff0c;可以按照以下步骤操作&#xff1a; 打开CMD窗口。可以通过按下Windows键R&#xff0c;输入“cmd”并回车来打开它。在CMD窗口中&#xf…

    【LINUX笔记】驱动开发框架

    应用程序调动驱动程序 驱动模块运行模式 模块加载-卸载 加载卸载注册函数 加载 驱动编译完成以后扩展名为.ko&#xff0c;有两种命令可以加载驱动模块&#xff1a; insmod和modprobe 驱动卸载 驱动注册注销 //查看当前已经被使用掉的设备号 cat /proc/devices 实现设备的具…

    按键模拟精灵

    按键模拟精灵功能简单&#xff1a; 1.添加模拟按键 2.删除模拟按键 3.开始模拟 4.停止模拟 适合简单的按键操作&#xff0c;有需要的可以点赞收藏关注我&#xff01;

    【家用机卖到服务器的笔电】苹果MacBook Pro搭载M3 Max芯片的型号

    苹果MacBook Pro搭载M3 Max芯片的型号之所以定价高昂&#xff0c;可以从以下几个方面来解释&#xff1a; 1. **先进技术与性能**&#xff1a; - M3 Max是苹果自家设计的基于ARM架构的高性能处理器&#xff0c;采用了先进的5纳米或更先进制程工艺&#xff0c;提供了极为强大…

    docker部署服务无法自动注册xxl-job问题排查和解决

    最近部署了一个服务&#xff0c;使用docker部署&#xff08;network:host模式&#xff09;&#xff0c;2个节点的服务自动注册xxl-job&#xff0c;但是测试环境没有问题&#xff0c;生产环境一直注册失败&#xff0c;虽然可以在项目配置中使用"类似这样的配置"&#…

    Axure RP 9 for mac中文版密钥激活版下载

    Axure RP 9是一款专业的快速原型设计工具&#xff0c;它可以帮助产品设计师、交互设计师和用户体验设计师等创建高保真度、交互性强的原型&#xff0c;以便在产品开发之前进行测试和用户验证。 软件下载&#xff1a;Axure RP 9 for mac中文版密钥激活版下载 该工具具有丰富的功…

    javaSwing俄罗斯方块

    目录 1 绪论 1.1程序开发背景及意义 1.2开发技术概述 1.3俄罗斯方块游戏的研究现状 1.3.1 国内外研究现状 1.3.2 文献综述 2相关技术 2.4.1 硬件平台&#xff1a; 2.4.2 软件平台&#xff1a; 3 系统分析 3.1可行性分析 3.1.1经济可行性分析 3.1.2技术可行性分析 3.1.3社会可行…

    Linux 文件系统:重定向、缓冲区

    目录 一、重定向 1、输出重定向 2、输入重定向 3、追加重定向 4、dup2 系统调用 二、理性理解Linux系统下“一切皆文件” 了解硬件接口 三、缓冲区 1、为什么要有缓冲区? 2、刷新策略 3、缓冲模式改变导致发生写时拷贝 未创建子进程时 创建子进程时 使用fflush…

    ubuntu將en01變成eth0的形式

    文章目录 前言一、操作步驟1、打開grub文件2、輸入更新指令3、查看結果 二、使用步骤总结 前言 一、操作步驟 1、打開grub文件 使用管理員權限打開&#xff0c;添加新內容 sudo gedit grub2、輸入更新指令 sudo update-grub3、查看結果 使用ifconfig查看是否修改成功&…

    安达发|印刷包装APS生产计划排产系统的商业价值

    在当今快速消费和竞争激烈的市场环境中&#xff0c;印刷包装行业面临着前所未有的挑战。随着客户需求的多样化、交付期限的缩短以及原材料价格的波动&#xff0c;传统的生产管理方法已无法满足现代印刷包装企业的复杂需求。为了保持竞争力&#xff0c;企业必须采用先进的生产计…

    接口测试面试题整理

    HTTP, HTTPS协议 什么是DNSHTTP协议怎么抓取HTTPS协议说出请求接口中常见的返回状态码http协议请求方式HTTP和HTTPS协议区别HTTP和HTTPS实现机有什么不同POST和GET的区别HTTP请求报文与响应报文格式什么是Http协议无状态协议?怎么解决HTTP协议无状态协议常见的POST提交数据方…