LeetCode 310. 最小高度树(图 聪明的BFS,从外向内包围)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 暴力BFS
      • 2.2 聪明的BFS

1. 题目

对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。

格式

该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。

你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。

示例 1:
输入: n = 4, edges = [[1, 0], [1, 2], [1, 3]]0|1/ \2   3 输出: [1]示例 2:
输入: n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]0  1  2\ | /3|4|5 输出: [3, 4]说明:根据树的定义,树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
树的高度是指根节点和叶子节点之间最长向下路径上边的数量。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-height-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 暴力BFS

  • 从每个节点开始BFS,记录高度,选择最小的高度的起点即可
  • 节点很多的时候,会超时
    在这里插入图片描述
class Solution {unordered_map<int,unordered_set<int>> g;vector<int> vertex;queue<int> q;
public:vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {for(auto& e : edges){g[e[0]].insert(e[1]);g[e[1]].insert(e[0]);}bool visited[n];int minh = INT_MAX, h;for(int i = 0; i < n; i++){memset(visited, 0, sizeof(visited));h = 0;visited[i] = true;q.push(i);BFS(h,visited);if(h < minh){minh = h;vertex.clear();vertex.push_back(i);}else if(h == minh)vertex.push_back(i);}return vertex;}void BFS(int& h, bool* visited){int tp, size;while(!q.empty()){size = q.size();while(size--){tp = q.front();q.pop();for(const int& id : g[tp]){if(!visited[id]){q.push(id);visited[id] = true;}}}h++;}}
};

优化下

  • 是最外围的节点?是最外围的,不用从他开始BFS,高度肯定不是最小的
  • 见以下代码,还是超时!!!
class Solution {unordered_map<int,unordered_set<int>> g;vector<int> vertex;queue<int> q;vector<int> lastLv;
public:vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {for(auto& e : edges){g[e[0]].insert(e[1]);g[e[1]].insert(e[0]);}bool visited[n];bool outSide[n];//是最外围的节点?是最外围的,不用从他开始BFS,高度肯定不是最小的memset(outSide, 0, sizeof(outSide));int minh = INT_MAX, h = 0;for(int i = 0; i < n; i++){if(minh > 2 && outSide[i])continue;memset(visited, 0, sizeof(visited));h = 0;visited[i] = true;q.push(i);BFS(h,visited,outSide);if(h < minh){minh = h;vertex.clear();vertex.push_back(i);}else if(h == minh)vertex.push_back(i);}return vertex;}void BFS(int& h, bool* visited, bool* outSide){int tp, size;while(!q.empty()){size = q.size();lastLv.clear();while(size--){tp = q.front();q.pop();for(const int& id : g[tp]){if(!visited[id]){q.push(id);visited[id] = true;lastLv.push_back(id);}}}h++;}for(auto id : lastLv)outSide[id] = true;}
};

2.2 聪明的BFS

  • 最低的高度树,可能的root只有1个或者2个(相当于把一个数组平分两半,奇偶可能)
  • 那么从图中最外围的节点,开始找(出入度为1),把所有的出入度为1的节点push进入队列
  • 一层层的剥离节点,到遍历的节点只剩下2个或者1时,即找到答案
class Solution {
public:vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {if(n == 1)return {0};int i, tp, size;unordered_map<int,unordered_set<int>> g;//图的邻接表vector<int> vertex;queue<int> q;//队列for(auto& e : edges){g[e[0]].insert(e[1]);//g[e[1]].insert(e[0]);}for(i = 0; i < n; i++)if(g[i].size() == 1)//出入度1,最外层的节点q.push(i);//进入队列while(n > 2)//剩余节点大于2{size = q.size();//在队列里的节点,减去n -= size;//剩余的节点个数nwhile(size--){tp = q.front();//待删除的节点q.pop();for(const int& id : g[tp]){g[id].erase(tp);if(g[id].size() == 1)//id变成最外层了q.push(id);//进入队列,待删}}}while(!q.empty()){vertex.push_back(q.front());q.pop();}return vertex;}
};

在这里插入图片描述

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

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

相关文章

Emma使用与分析

什么是Emma EMMA 是一个开源、面向 Java 程序测试覆盖率收集和报告工具。 它通过对编译后的 Java 字节码文件进行插装&#xff0c;在测试执行过程中收集覆盖率信息&#xff0c;并通过支持多种报表格式对覆盖率结果进行展示。 EMMA 所使用的字节码插装不仅保证 EMMA 不会给源代码…

论文浅尝 | WWW2022 - “知识提示”之知识约束预训练微调

本文作者 | 陈想&#xff08;浙江大学&#xff09;、张宁豫&#xff08;浙江大学&#xff09;、谢辛&#xff08;陈想&#xff09;、邓淑敏&#xff08;浙江大学&#xff09;姚云志&#xff08;浙江大学&#xff09;、谭传奇&#xff08;阿里巴巴&#xff09;&#xff0c;黄非&…

吐血整理:论文写作中注意这些细节,能显著提升成稿质量

文 | python编 | 小轶前言不知诸位在科研的起步阶段&#xff0c;是否曾有过如下的感受&#xff1a;总感觉自己写的论文就是和自己读过的论文长得不太一样&#xff0c;也不知道为啥。投稿的时候&#xff0c;审稿人也总是 get 不到论文的核心&#xff0c;只揪着论文的次要细节不放…

LeetCode 1237. 找出给定方程的正整数解

1. 题目 给出一个函数 f(x, y) 和一个目标结果 z&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。 给定函数是严格单调的&#xff0c;也就是说&#xff1a; f(x, y) < f(x 1, y) f(x, y) < f(x, y 1)函数接口定义如下&#xff1a; interface Cu…

基于Wi-Fi的室内定位在美团总部的实践和应用(上)

室内定位技术的商业化必将带来一波创新高潮&#xff0c;尤其是在O2O领域&#xff0c;各种基于此技术的应用将出现在我们的面前。我们可以想象一些比较常见的应用场景&#xff0c;比如在大型商场里面借助室内导航快速找到目标商铺&#xff0c;商店根据用户的具体位置向用户推送更…

LeetCode 1266. 访问所有点的最小时间(数学)

1. 题目 平面上有 n 个点&#xff0c;点的位置用整数坐标表示 points[i] [xi, yi]。请你计算访问所有这些点需要的最小时间&#xff08;以秒为单位&#xff09;。 你可以按照下面的规则在平面上移动&#xff1a; 每一秒沿水平或者竖直方向移动一个单位长度&#xff0c;或者…

Coding Party 邀你出战!飞桨黑客马拉松线下场来啦

12月4-5日&#xff0c;这48H&#xff0c;与100开发者HACK Together“黑客”很酷&#xff1f;和“黑客”一起“战斗”是种什么样的体验&#xff1f;你参与这场“战斗”了吗&#xff1f;PaddlePaddle Hackathon 2021飞桨黑客马拉松&#xff0c;由百度飞桨联合深度学习技术及应用国…

技术动态 | 「知识图谱嵌入技术研究」最新2022综述

转载公众号 | 专知知识图谱(KG)是一种用图模型来描述知识和建模事物之间关联关系的技术. 知识图谱嵌入(KGE)作为一 种被广泛采用的知识表示方法,其主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中,用来简化操作, 同时保留 KG 的固有结构.它可以使得多种下游任务受益…

全球仅3000人通过的TensorFlow开发人员认证到底有多香!

现在&#xff0c;我们每个人都已经习惯了社交网络&#xff0c;随时随地都能进行微信、QQ语音和视频通话。那么&#xff0c;你是否发现在不同场景下&#xff0c;这些社交软件音频、视频都是那么的流畅&#xff0c;这背后是什么科技在支撑这“声”与“话”的美好呢&#xff1f;这…

LeetCode 1043. 分隔数组以得到最大和(DP)

1. 题目 给出整数数组 A&#xff0c;将该数组分隔为长度最多为 K 的几个&#xff08;连续&#xff09;子数组。分隔完成后&#xff0c;每个子数组的中的值都会变为该子数组中的最大值。 返回给定数组完成分隔后的最大和。 示例&#xff1a; 输入&#xff1a;A [1,15,7,9,2,…

图谱实战 | 安全领域知识图谱建设与典型应用场景总结

转载公众号 | 老刘说NLP 安全知识图谱是网络安全领域专用知识图谱&#xff0c;也是知识图谱应用于安全业务的重要工业尝试。当前&#xff0c;安全领域中存在大量的业务数据&#xff0c;建模需求以及应用需求&#xff0c;了解安全领域知识图谱的建设方法以及典型应用场景&#x…

Hadoop安全实践

前言 在2014年初&#xff0c;我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版&#xff0c; 与此同时部署了 Hadoop 的安全认证。本文主要介绍在 Hadoop 2.2.0 上部署安全认证的方案调研实施以及相应的解决方法。 背景 集群安全措施相对薄弱 最早部署Hadoop集群时并…

论文浅尝 | KGQR: 用于交互式推荐的知识图谱增强Q-learning框架

笔记整理&#xff1a;李爽&#xff0c;天津大学链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3397271.3401174动机交互式推荐系统(IRS)以其灵活的推荐策略和考虑最佳的长期用户体验而备受关注。为了处理动态用户偏好&#xff0c;研究人员将强化学习(reinforcement lear…

收藏清单:史上最全java自动化测试工具汇总

xUnit frameworks 单元测试框架 JUnit - 常用的测试框架TestNG - 测试框架 Test Data Supplier - TestNG DataProvider封装&#xff0c;让数据的生成更加灵活 TDD \ ATDD \ BDD 工具 JBehave - Behaviour-Driven Development (BDD)测试框架. BDD是从 test-driven development…

LeetCode 1014. 最佳观光组合

1. 题目 给定正整数数组 A&#xff0c;A[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的距离为 j - i。 一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为&#xff08;A[i] A[j] i - j&#xff09;&#xff1a;景点的评分之和减去它…

聊聊推荐系统的高阶特征交叉问题

文 | 水哥源 | 知乎Saying1. DCN看起来给了我们很好的允诺&#xff0c;但是细细想来是有一些问题的&#xff0c;这里也可以参考大佬的意见2. 高阶FM的核心设计是先element-wise乘&#xff0c;再对embedding求和。核心优化方法是利用计算中的冗余构建递推关系&#xff0c;然后使…

COS系统的前端演变和发展

背景 美团COS&#xff1a;全称美团网核心业务系统部&#xff0c;以持续整合O2O线下资源&#xff0c;共建高效率、低成本的供应链系统&#xff0c;高效推动O2O生态环境建设为业务目标&#xff0c;负责美团网核心业务系统的建设和管理。 COS系统&#xff0c;伴随着美团3年多的发展…

OpenKG 祝大家元宵节快乐!

OpenKGOpenKG&#xff08;中文开放知识图谱&#xff09;旨在推动以中文为核心的知识图谱数据的开放、互联及众包&#xff0c;并促进知识图谱算法、工具及平台的开源开放。点击阅读原文&#xff0c;进入 OpenKG 网站。

LeetCode 1262. 可被三整除的最大和(DP)

1. 题目 给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff08;可被 3 整除的最大和&#xff…

LeetCode 1253. 重构 2 行二进制矩阵(贪心)

1. 题目 给你一个 2 行 n 列的二进制数组&#xff1a; 矩阵是一个二进制矩阵&#xff0c;这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列&#xff08;从 0 开始编号&#xff09;的元素之和为 colsum[i]&#xff0c;…