leetcode 310. Minimum Height Trees

2024-02-27 00:08

本文主要是介绍leetcode 310. Minimum Height Trees,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目是给了一个图,求把某个节点提起来后,形成的树的高度最小。

第一个想法就是暴力搜索。

        把每个点提起来,然后计算并对比树的高度。

        结果就是超时。

        优化了一些,发现还是没有办法在规定时间内处理完。

看了网上的大神huifeng guan和残酷刷题群之前的解法,觉得自己太low了。

既然题目要求提起某个节点后树的高度最小,问题转换下就是某个节点提起来后到其余的每个节点的距离最短。

我的高中的楼布局就是和这道题的图差不多,高一在北美的楼,高二,高三实验楼,教师楼,音乐,体育馆。都是互相通过楼梯链接一起。

我们的这个问题就好比安排高中教导主任的办公室一样,要找个合适的位置。这样可以迅速的到达战场。

那这个问题就简单一些了,把教导主任的办公室安排到所有楼里最中心的那个楼。

第一个例子就可以看到,把教导主任安排在1的位置就能第一时间到达战场。

对于第二个例子

想找到最核心的位置就得用到剥洋葱的办法,一层皮一层皮的剥。

先剥掉最外面一层洋葱(楼), 也就是5, 0, 1, 2 这些最外面的洋葱(楼),然后就剩下3,4.

这两个楼就没有办法再剥了,再剥就连教导主任的存在都可以省掉了。

这样的话,把教导主任随意安排到3或者4号楼就行了。

用拓扑排序从最外面开始剥皮,剥到最后一层。留下来的就是答案了。

 class Solution {
public:
    unordered_map<int ,vector<int>> buildGraphic(vector<vector<int>>& edges)
    {
        unordered_map<int ,vector<int>> neighbors;
        
        for(auto edge: edges) 
        {
            neighbors[edge[0]].push_back(edge[1]);
            neighbors[edge[1]].push_back(edge[0]);
        }
                
        return neighbors;
    }
    
    unordered_map<int, int> buildDegree(unordered_map<int ,vector<int>> neighbors){
        unordered_map<int, int> degree;
        
        for(auto neighbor: neighbors){
            degree[neighbor.first] = neighbor.second.size();
        }
        
        return degree;
    }
    
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        //build graphic
        //set every node as root node and using bfs go through the tree level by level.
        //push the root if the levels is min.
        vector<int> ret;
        if(edges.size() ==0 && n !=0)
            for(int i=0;i<n;i++)
                ret.push_back(i);
        
        unordered_map<int ,vector<int>> neighbors = buildGraphic(edges);
        unordered_map<int, int> degrees = buildDegree(neighbors);
        unordered_set<int> accessed;
        
        queue<int> myqueue;
        //push the most out building into the queue
        for(auto degree: degrees) {
            if(degree.second == 1)
                myqueue.push(degree.first);
        }
        
        while(!myqueue.empty()) {
            ret.clear();
            int size = myqueue.size();
            for(int i=0;i<size;i++) {
                int cur=myqueue.front();
                myqueue.pop();
                ret.push_back(cur);
                
                for(auto neighbor: neighbors[cur]){
                    degrees[neighbor]--;
                    if(degrees[neighbor] == 1)
                        myqueue.push(neighbor);
                }
            }
        }
        return ret;
    }
};

这篇关于leetcode 310. Minimum Height Trees的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划