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

ABtest描述统计功效 我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉 阅读详情

个人认为这是一道挺难的题,本来以为是考察DFS、BFS的用法,因此一直构思如何遍历所有点并求出相应的树的高度并找出最小值,但写了很久发现还是写不出来。最后只能上网看一下这道题的思路,才知道这题重点考察图的运用。

这道题的算法思想是:先用二维向量构造出图,找出所有叶子结点,而连接这些叶子结点的父节点也要相应剪掉这些叶子结点;而当这些父节点变成叶子结点的时候,同样进行上述步骤。重复以上过程,直到只剩下不多于两个节点的根节点。

虽然算法乍看下来还是很简单的,但是实现起来我还是才了不少坑(C++学艺不精的结果)。一开始我用的是vector+list来存储图的,在循环遍历删除叶子结点时一直报错,结果发现是for循环中使用iterator++会导致迭代器指向错误;更改之后仍然在同一位置报错,仔细查看原来是iterator.erase()会使原迭代器失效,因此需要将iterator.erase()返回的迭代器赋值给原迭代器才可以。顺利debug之后的代码如下,但是TLE:

class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
        if (edges.size() == 0) {
            vector<int> vec;
            vec.push_back(0);
            return vec;
        }
        vector<list<int>> graph(n, list<int>());
        queue<int> q;
        list<int>::iterator it;
        vector<int> res;
        int count = 0;
        for (auto t : edges) {
            graph[t.first].push_back(t.second);
            graph[t.second].push_back(t.first);
        }
        for (int i = 0; i < graph.size(); i++) {
            if (graph[i].size() == 1) {
                q.push(i);
            }
        }
        while (n - 2 > count) {
            int times = q.size();
            while (times--) {
                int tmp = q.front();
                int i;
                for (i = 0; i < graph.size(); i++) {
                    if (tmp != i) {
                        for (it = graph[i].begin(); it != graph[i].end(); it) {
                            if (tmp == *it) {
                                it = graph[i].erase(it);
                                if (graph[i].size() == 1) {
                                    q.push(i);
                                }
                            }
                            else
                                it++;
                        }
                    }
                    else
                        graph[i].erase(graph[i].begin());
                }
                q.pop();
                count++;
            }
        }
        while (!q.empty()) {
            res.push_back(q.front());
            q.pop();
        }
        return res;
    }
};
后来查资料发现list.size()的时间复杂度为O(n),因此使用这个函数会耗费太多时间,于是重新使用vector+set来作出图,但仍然是TLE:

class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
        if (edges.size() == 0) {
            vector<int> vec;
            vec.push_back(0);
            return vec;
        }
        vector<set<int>> graph(n, set<int>());
        queue<int> q;
        set<int>::iterator it;
        vector<int> res;
        int count = 0;
        for (auto t : edges) {
            graph[t.first].insert(t.second);
            graph[t.second].insert(t.first);
        }
        for (int i = 0; i < graph.size(); i++) {
            if (graph[i].size() == 1) {
                q.push(i);
            }
        }
        while (n - 2 > count) {
            int times = q.size();
            while (times--) {
                int tmp = q.front();
                int i;
                for (i = 0; i < graph.size(); i++) {
                    if (tmp != i) {
                        for (it = graph[i].begin(); it != graph[i].end(); it) {
                            if (tmp == *it) {
                                it = graph[i].erase(it);
                                if (graph[i].size() == 1) {
                                    q.push(i);
                                }
                            }
                            else
                                it++;
                        }
                    }
                    else
                        graph[i].erase(graph[i].begin());
                }
                q.pop();
                count++;
            }
        }
        while (!q.empty()) {
            res.push_back(q.front());
            q.pop();
        }
        return res;
    }
};
百思不得其解,最后还是去网上参考了别人的做法,发现erase时根本不需要两重循环,活用图能够极快的完成删除操作:

class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) {
        if (edges.size() == 0) {
            vector<int> vec;
            vec.push_back(0);
            return vec;
        }
        vector<set<int>> graph(n, set<int>());
        queue<int> q;
        set<int>::iterator it;
        vector<int> res;
        int count = 0;
        for (auto t : edges) {
            graph[t.first].insert(t.second);
            graph[t.second].insert(t.first);
        }
        for (int i = 0; i < graph.size(); i++) {
            if (graph[i].size() == 1) {
                q.push(i);
            }
        }
        while (n - 2 > count) {
            int times = q.size();
            while (times--) {
                int tmp = q.front();
                for (auto t : graph[tmp]) {
                    graph[t].erase(tmp);
                    if (graph[t].size() == 1) {
                        q.push(t);
                    }
                }
                q.pop();
                count++;
            }
        }
        while (!q.empty()) {
            res.push_back(q.front());
            q.pop();
        }
        return res;
    }
};
由于图能清楚快速找到某个元素所连接的其他节点,因此可以找出要删除节点所连接的其他节点,并且set能通过迭代器也能根据元素直接删除的特性,从图找出其他节点的set集合再快速erase需要删除的节点,能大量降低复杂度,可以轻松AC。

总的来说,这道题收获还是很大的,除了对图有了更深的理解之外,也了解了STL各种容器之间的差异以及自己对其认识的不足,更能加深对各个STL容器的理解,对今后的学习非常有帮助。

【open judge】【程设】魔兽世界三开战! #程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include&lt;typeinfo&gt;)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再... 阅读详情

相关推荐

2024.6.15丨基于VFDB数据库的致病菌毒力因子注释实战指南

本文提供了一份基于VFDB数据库进行致病菌毒力因子本地化注释的实战指南。详细介绍了从环境准备、DIAMOND工具安装、VFDB数据库选择与构建,到核心比对操作及结果解读与过滤的全流程。重点阐述了本地化分析相较于在线工具在速度、稳定性和批量处理上的优势,旨在帮助微生物基因组研究人员高效、精准地识别致病菌的关键毒力因子。

weixin_29220405的博客 269

最小高度树(c++实现)

【代码】最小高度树(c++实现)

zyang654321的博客 506

channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

一、原因 网络上传播的数据都是字节(二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串转换成字节进行传输。、 二、解决办法 1、手动序列化 服务端: channelGroup.writeAndFlush(Unpooled.copiedBuffer("【客户端】"+remoteAddress+"已下线"+format.format(new Date()), Cha

haohaoxuexiyai的博客 4059

Leetcode 310. 最小高度树 C++

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

weixin_43750513的博客 605

无线自组织网络基础知识

参考书籍:《无线自组织网络路由协议及应用》 目录第一章 绪论1.1 无线自组织网络概述1.1.1 无线自组织网络的定义及分类1.1.2无线自组织网络的主要特点1.1.3无线自组织网络的应用与发展1.无线自组织网络的应用2.无线自组织网络的起源和发展1.2典型的无线自组织网络1.2.1移动Ad Hoc网络1、移动Ad Hoc网络的定义2.移动AdHoc网络的特点3.移动Ad Hoc网络的应用1.2....

逸凌Time 2万+

基于STM32的Keil5代码自动补全设置操作指南

掌握Keil5代码自动补全设置技巧,提升STM32开发效率。通过合理配置编辑器选项,实现智能提示与语法补全,让嵌入式编程更流畅,尤其适合使用keil5代码自动补全设置的开发者快速上手。

weixin_32287387的博客 761

【Leetcode】310. 最小高度树

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

zzy0006的博客 466

[Stanford CS217]CUDA中矩阵乘法GEMM优化的最关键点:向量内积和向量外积分别取行和取列

对于矩阵C中的每一个tile,矩阵A与矩阵B中的tile只需要读取一次,这样就可以达到 O(N) 的计算强度。理想情况下性能应当受限于算术吞吐量,确切来说对于一个大型方阵,即 M=N=K ,矩阵乘法的数学操作复杂度为 O(N3) ,而数据量为 O(N2) ,同时计算强度为 N (这里的计算强度可以被理解为同一个数据被重复利用的次数)。GEMM就是指计算 C=A∗B+C ,其中 A 、B和C都是矩阵,A是 M×K 的矩阵,B是 K×N 的矩阵, C是 M×N 的矩阵。这就是向量内积和向量外积的最大区别。

weixin_55035144的博客 1425

310.最小高度树

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

Phoenix_ZengHao的博客 582

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

uniapp - 强力解决 swiper 轮播图内嵌套视频导致滑动不流畅卡顿问题,轮播滑块视图容器里既有图片也有视频video组件共同存在出现滑动切换特别卡,轮播组件包裹视频播放器加载慢及层级过高解决

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,swiper,轮播图,轮播图嵌套视频,卡顿,加载慢,左右滑动不流畅,很卡,滑动过快就会卡住,uniapp使用swiper组件里嵌套视频与图片如何解决卡顿问题,详细解决教程,swiper里有视频video,播放器,视频+图片轮播,层级过高及卡顿问题,没等看完视频就自动切换了,报错,无法加载播放,uniapp的App安卓苹果端,video老是加载,APP端video组件播放视频卡顿,抖音,快手,上下滑动视

🏆 前端领域优质创作者 1万+

LeetCode面试题 04.02. 最小高度树(C++,递归)

1. 题目 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 ...

rosefun96的博客 543

Claude Code设置中文输出指南

Claude Code 的语言配置其实并不复杂,只要做好全局的默认设置,再加上一些小的提醒技巧,就能完全避免突然切换英文的问题,让你全程用中文流畅地和 AI 助手协作,不用再被语言问题打断工作节奏,真正提升开发效率。

篮球界最会写bug的人;程序猿中打球最菜的人。 2206

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

leetcode 310. 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 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] = [

蓝羽飞鸟的博客 719

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Leetcode310. Minimum Height Trees最小高度树

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

lMonster81 381

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[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

【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

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

LeetCode-310. Minimum Height Trees (JAVA) 图中最矮的树

LeetCode-310. Minimum Height Trees (JAVA) 图中最矮的树

mine_song的博客 1383

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

liuyh73的博客 787

力扣 310. 最小高度树

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

(ง •_•)ง没有困难的工作,只有勇敢的狗狗 818
上一篇: 210. Course Schedule II(课程清单之二)
下一篇: 399. Evaluate Division(除法推理)
BetweenRain
博客等级 码龄9年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值