当前位置: 首页 > article >正文

【LeetCode每日一题】310. 最小高度树

文章目录

    • [310. 最小高度树](https://leetcode.cn/problems/minimum-height-trees/)
          • 思路:拓扑排序
          • 代码:


310. 最小高度树

在这里插入图片描述
在这里插入图片描述

思路:拓扑排序
  1. 首先判断节点数量n,如果只有一个节点,则直接返回该节点作为最小高度树的根节点。
  2. 构建邻接表g和度数数组degree:
    • 使用邻接表g存储每个节点的相邻节点。
    • 使用度数数组degree存储每个节点的度数(即相邻节点的数量)。
  3. 遍历边数组edges,构建邻接表g和更新度数数组degree:
    • 对于每条边[e[0], e[1]],将节点e[0]与节点e[1]互相添加到各自的邻接表中,同时更新它们的度数。
  4. 初始化队列q,并将所有叶子节点(度数为1的节点)加入队列:
    • 遍历所有节点,将度数为1的节点加入队列q。
  5. 使用BFS遍历叶子节点层级,不断更新度数并将新的叶子节点加入队列:
    • 从队列中取出当前层级的叶子节点,更新其相邻节点的度数。
    • 若相邻节点的度数更新为1,则将其加入队列q。
  6. 最终队列中剩下的节点即为最小高度树的根节点列表,将其返回作为结果。
代码:
class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        // 如果只有一个节点,直接返回该节点
        if (n == 1) {
            return List.of(0);
        }

        // 构建邻接表
        List<Integer>[] g = new List[n];
        Arrays.setAll(g, k -> new ArrayList<>());
        int[] degree = new int[n]; // 存储每个节点的度数
        for (int[] e : edges) {
            int a = e[0], b = e[1];
            g[a].add(b);
            g[b].add(a);
            ++degree[a];
            ++degree[b];
        }

        Deque<Integer> q = new ArrayDeque<>();
        // 将所有叶子节点(度数为1)加入队列
        for (int i = 0; i < n; ++i) {
            if (degree[i] == 1) {
                q.offer(i);
            }
        }

        List<Integer> ans = new ArrayList<>();
        while (!q.isEmpty()) {
            ans.clear(); // 清空结果列表
            // 遍历当前层的节点
            for (int i = q.size(); i > 0; --i) {
                int a = q.poll();
                ans.add(a); // 将当前节点加入结果列表
                // 更新与当前节点相邻的节点的度数
                for (int b : g[a]) {
                    if (--degree[b] == 1) {
                        q.offer(b); // 若更新后度数为1,则加入队列
                    }
                }
            }
        }
        return ans; // 返回最终结果列表
    }
}

点击移步博客主页,欢迎光临~

偷cyk的图


http://www.kler.cn/a/272801.html

相关文章:

  • 群论学习笔记
  • ZooKeeper 核心概念与机制深度解析
  • 贪心算法(题1)区间选点
  • 合格的前端,使用xlsx
  • SurfaceFlinger代码笔记
  • HTML中link的用法
  • 如何计算视频流需要的服务器带宽
  • 在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭
  • 【兔子机器人】实现从初始状态到站立
  • Python实战:sqlite3模块应用
  • 跨境电商应该用什么样的服务器?多大带宽?
  • 产品经理:前端实现网页防篡改,你会怎么做?
  • 程序员应该如何选择职业赛道?
  • MyBatis-Plus之乐观锁案例
  • opencv人脸识别实战3:多线程和GUI界面设计(PyCharm实现)
  • C++学习基础版(一)
  • 界面控件DevExpress ASP.NET Scheduler - 助力快速交付个人信息管理系统(下)
  • react native 实现自定义底部导航与路由文件配置
  • HBase常用命令
  • Matlab|【免费】基于半不变量的概率潮流计算
  • Web 开发模式演进过程
  • 如何在webapp中手动部署
  • 蚓链助新零售企业快速实现数字化转型
  • Python使用 k 均值对遥感图像进行语义分割
  • PHP 生成图片
  • 自然语言处理实验2 字符级RNN分类实验