leetcode 310. Minimum Height Trees(最小高度树)

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591) FortiOS 是 Fortinet 公司开发的操作系统,作为 Fortinet 安全平台的核心,提供全面的网络安全功能。 它将网络和安全功能无缝集成,支持跨本地、云、混合和融合 IT/OT/IoT 基础设施环境的统一管理。 FortiOS 7.6 版本引入了生成式人工智能助手、数据保护、托管服务和单一代理等新功能,进一步增强了其安全性和性能。 阅读详情

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.

Given a tree of n nodes labelled from 0 to n - 1, and an array of n - 1 edges where edges[i] = [ai, bi] indicates that there is an undirected edge between the two nodes ai and bi in the tree, you can choose any node of the tree as the root. When you select a node x as the root, the result tree has height h. Among all possible rooted trees, those with minimum height (i.e. min(h)) are called minimum height trees (MHTs).

Return a list of all MHTs’ root labels. You can return the answer in any order.

The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.
在这里插入图片描述
一个无向图表示的树,有n个节点(0到n-1),边edges = [ai, bi]表示第i条边的两个端点是ai, bi。
选任一节点作为root, 可得到一个树的高度。
返回可以得到最小高度的所有root

思路:
可以用拓扑排序,先介绍下拓扑排序。参考链接
在这里插入图片描述
这里同样选一个入度为0的node,一层一层删掉,最后剩<=2个node时结束,剩下的node就是我们需要的root

为什么要这样做?因为每次删掉的都是入度为0(最外层)的node,剩下的是处于最中间的node
为什么要选剩下的<=2个节点?剩一个节点时,它肯定是最中间的root。剩两个时,两个谁做root,高度都是一样的。当剩3个时,由于树中不存在环,肯定有一个高度是大于另外两个的。

具体实现步骤:

  1. 将输入的边edges构建成图,注意无向图要双向
  2. 找到入度为0(即仅有一个边)的node,放入queue
  3. 由于是无向图,需要从边的另一端点对应的连接node表中,删除当前node,删除完后,如果只剩下一个边,装入queue,作为下一轮删除对象
  4. 直到queue中只剩下<=2个节点,返回
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> roots = new ArrayList<>();
        if(n == 0 || edges == null) return roots;
        
        if(n == 1) {
            roots.add(0);
            return roots;
        }
        if(n == 2) {
            roots.add(0);
            roots.add(1);
            return roots;
        }
        
        //HashSet便于删除node
        List<Set<Integer>> graph = new ArrayList<>(n);
        
        for(int i = 0; i < n; i++) {
            graph.add(new HashSet<Integer>());
        }
        
        //无向图
        for(int[] edge : edges) {
            graph.get(edge[0]).add(edge[1]);
            graph.get(edge[1]).add(edge[0]);
        }
        
        for(int i = 0; i < n; i++) {
            if(graph.get(i).size() == 1) {
                roots.add(i);
            }
        }
        
        while(n > 2) {
            n -= roots.size();  //遍历下来roots里面的节点都要删除
            List<Integer> newRoots = new ArrayList<>(); //保存新的叶子节点
            for(Integer root : roots) {
                int node = graph.get(root).iterator().next();
                graph.get(node).remove(root);
                if(graph.get(node).size() == 1) newRoots.add(node);
            }
            roots = newRoots;
        }
        return roots;
        
    }

上面的方法有点耗时,主要是在于要从边的另一端点所对应的表中删除当前node。其实我们想要的只是看入度是否为0(是否只有一条边),即边的另一端点所对应的表的size是否为1。并不关心每个点具体和哪个点相连接。

可以建立一个数组,记录每个node有几条边,当只有一条边时加入queue,就不需要再反复地删除节点了。

以下是错误做法,因为如果没有新添加入度为0的节点,而queue中的节点仅剩两个的时候,就会跳出循环,queue中保存的之前的节点会处理不完

while(queue.size() > 2) {
            int deleteNode = queue.poll();
            //由于没有节点删除这一步了,要遍历整个连接点的表
            int deleteConnectNode = graph[deleteNode].get(0); //入度为0,肯定只连接一个点
            degree[deleteNode] --;
            degree[deleteConnectNode] --;
            if(degree[deleteConnectNode] == 1) queue.offer(deleteConnectNode);
        }

完整代码

    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        List<Integer> roots = new ArrayList<>();
        if(n == 0 || edges == null) return roots;
        
        if(n == 1) {
            roots.add(0);
            return roots;
        }
        if(n == 2) {
            roots.add(0);
            roots.add(1);
            return roots;
        }
        
        ArrayList<Integer>[] graph = new ArrayList[n];
        int[] degree = new int[n];
        Queue<Integer> queue = new LinkedList<Integer>();
        boolean[] removed = new boolean[n];
        
        for(int i = 0; i < n; i++) {
            graph[i] = new ArrayList<Integer>();
        }
        
        
        for(int[] edge : edges) {
            graph[edge[0]].add(edge[1]);
            graph[edge[1]].add(edge[0]);
            degree[edge[0]] ++;
            degree[edge[1]] ++;
        }
        
        for(int i = 0; i < n; i++) {
            if(degree[i] == 1) queue.offer(i); 
        }
        
        while(n > 2) {
            int size = queue.size();
            n -= size;
            while(size > 0) {
                int deleteNode = queue.poll();
                removed[deleteNode] = true;
                for(int deleteConnectNode : graph[deleteNode]) {
                    if(removed[deleteConnectNode]) continue;
                    degree[deleteConnectNode] --;
                    if(degree[deleteConnectNode] == 1) queue.offer(deleteConnectNode);
                }
                size --;
            }
        }
        
        roots.addAll(queue);
        return roots;
    }
不加行也能填满:用 ABAP BDC 驯服 Table Control 滚动录制缺陷,批量维护供应商银行账户 摘要 本文探讨了在SAP ECC/S4HANA系统中处理供应商主数据时,Table Control控件带来的批量导入挑战。文章指出,银行账户维护界面中Table Control的滚动动作难以被录制工具捕捉,导致批量导入数据时仅能填充前5行。解决方案是通过BDC_OKCODE显式触发翻页(如=P+),并配合行号拼接(如(01)~(05))将数据写入不可见行。文中提供了完整的ABAP程序示例,展示了如何读取外部文件、动态生成BDCDATA、处理表格翻页逻辑,最终通过CALL TRANSACTION执行XK01事 阅读详情

相关推荐

CST微波工作室端口设置保姆级教程:从波导端口到离散端口,手把手教你搞定S参数仿真

本文提供CST微波工作室端口设置的详细教程,涵盖波导端口和离散端口的选择与配置,助力工程师精准完成S参数仿真。通过微带线滤波器案例,详解端口尺寸、阻抗设置及常见问题排查,提升仿真效率与准确性。

weixin_42570296的博客 358

最小高度树

力扣算法之最小高度树

qq_52916408的博客 1177

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

如图所示,用红线圈出的两条头文件引用会报错,提示无法找到他们,但是可以发现的是,他们的路径书写是没有问题的。在终端中运行时候,会出现如下的报错。

GFCLJY的博客 1006

LeetCode-310. 最小高度树【dfs,bfs,拓扑排序】

LeetCode-310. 最小高度树【dfs,bfs,拓扑排序】

zik的博客 761

电子图像增稳(EIS)原理详解——从抖动补偿到代码实现

电子图像增稳(EIS)是一种通过软件算法实现视频稳定的技术,广泛应用于GoPro、手机和无人机等设备。与光学防抖(OIS)和机械云台不同,EIS通过图像裁切和运动补偿来消除抖动,具有成本低、补偿范围大的优点,但会损失10-30%的画幅。其核心流程包括运动检测、抖动分离、运动补偿和图像裁切四个步骤。相比硬件方案,纯软件实现的EIS更适合消费级电子产品,已成为移动设备视频拍摄的重要技术。

电脑管家 409

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

本文介绍基于 Spring Boot AI 集成阿里云 OSS 与 DashScope 语音识别 API 的高效语音识别系统。该系统通过云端存储音频文件,解决传统本地存储的性能瓶颈与存储压力,支持同步 / 异步语音转文本,实现文件自动生命周期管理。文中详述技术选型、架构设计、核心代码实现(含前后端及配置)、部署流程,展现其高并发处理、可靠文件管理能力,适用于客服、教育等企业级场景,为语音识别应用提供实用解决方案。

博客 1537

310. Minimum Height Trees

本题给出一个有树性质的无向图,可以选择任何一个点做树根,要求在所有可能性中,找出树高最小的MHTs,并输出树根。 本题给出的图本身就是一棵树,不是一个最小生成树的问题。理论上求出每个节点对应的树高,然后排序即可,这样的复杂度在O(v*v),没有试过这样能不能过。 另一方面,也可以将问题转化来看,首先,先不考虑两个节点以下的情况,很显然图中入度为0的点形成的树一定不是MHTs;入度为1的点也不是,

zdinanyang的博客 449

STM32入门教程:人脸识别

STM32CubeMX配置 打开STM32CubeMX,创建一个新的工程,并选择你使用的STM32系列和具体型号。根据摄像头模块的规格,将摄像头的输出引脚连接到相应的STM32引脚上。人脸识别是一种非常常见的人工智能应用,它可以通过摄像头捕捉到的图像,识别出图像中的人脸并进行相关的分析和处理。在本教程中,我们将使用STM32开发板和相关传感器,通过指导你搭建一个基于STM32的简单人脸识别系统,并编写相应的代码来实现该功能。另外,为了达到更好的人脸识别效果,可能需要使用更高性能的处理器和更复杂的算法。

吃不胖. 374

[LeetCode]310. Minimum Height Trees

Minimum Height Trees

LadyCaro的博客 390

BMS控制板硬件设计核心要点与工程避坑指南

电池管理系统(BMS)硬件设计是保障锂电安全与寿命的关键环节,其本质是模拟前端精度、数字控制可靠性、电源完整性及电磁兼容性四大要素的系统协同。理解AFE芯片(如BQ76920)的物理层约束、MCU与专用监控IC的异构分工逻辑,是构建高鲁棒BMS的基础;而晶振布局、I²C总线匹配、MOSFET体二极管方向、开尔文采样等细节,直接决定量产良率与EMC合规性。在电动工具、储能系统、两轮电动车等中低功耗BMS应用中,成本敏感型方案常采用STM32F0+AFE架构,此时电源滤波电容选型、复位电路ESR控制、TVS/齐

weixin_30591519的博客 259

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9833

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 po

James Pan 3126

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1288

Leetcode310. Minimum Height Trees最小高度树

对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。 格式 该图包含n个节点,标记为0到n - 1。给定数字n和一个无向边edges列表(每一个边都是一对标签)。 你可以假设没有重复的边会出现在edges中。由于所有的边都是无...

lMonster81 381

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[Swift]LeetCode310. 最小高度树 | Minimum Height Trees

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/streng...

weixin_30906425的博客 177

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【LeetCode】310. Minimum Height Trees 最小高度树(Medium)(JAVA)

【LeetCode】310. Minimum Height Trees 最小高度树(Medium)(JAVA) 题目地址: https://leetcode.com/problems/minimum-height-trees/ 题目描述: A tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph

qq_16927853的博客 287

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

leetcode 310. Minimum Height Trees 最小高度树(中等)

leetcode 310. Minimum Height Trees 最小高度树(中等)

ln_ydc的专栏 187

leetcode 310. Minimum Height Trees | 310. 最小高度树(图的邻接矩阵DFS / 拓扑排序)

题目 https://leetcode.com/problems/minimum-height-trees/ 题解 方法1:图的邻接矩阵 DFS(超时) 我一想,这不就是个图嘛,于是随手敲出一个 DFS,结果。。超时了。 class Vertex { Integer val; List<Integer> next; public Vertex() { next = new LinkedList<>(); } } class Sol

寒泉 5万+

[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 mini...

weixin_30898109的博客 128

【leetcode_310】【中等】minimum-height-trees / 最小高度树

拓扑排序 无向图 degree自减

过得精彩,无所谓好坏 842

leetcode 310. Minimum Height Trees 图的构建+最小高度树+DFS深度优先遍历+拓扑排序

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 mini...

JackZhangNJU的专栏 1173

力扣 310. 最小高度树

题目 树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。 可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为 最小高

(ง •_•)ง没有困难的工作,只有勇敢的狗狗 818

LeetCode C++ 310. Minimum Height Trees【Graph/BFS/拓扑排序】中等

Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2] Example 2: Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4] Note: Each element in the result must be unique. The re

memcpy0的博客 617

LeetCode //C - 310. Minimum Height Trees

【代码】LeetCode //C - 310. Minimum Height Trees。

Made in Code 1238

[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 mini

coder 进阶的专栏 4537

【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 mini

aliceyangxi1987的博客 2057
上一篇: leetcode 147. Insertion Sort List (链表插入排序)
下一篇: leetcode 878. Nth Magical Number (第N个魔法数)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值