【每日一题】2603. 收集树中金币

news2025/2/23 22:28:52

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:拓扑排序
  • 写在最后

Tag

【拓扑排序】【树】


题目来源

2603. 收集树中金币


题目解读

有一个有 n 个节点的无相无根图,节点编号从 0n-1。有一个表示图中节点间连接关系的数组 edges,长度为 n-1edges[i] = [ai, bi] 表示节点 aibi 之间有一条边。还有一个数组 coinscoins[i]0 或者 1,表示节点 i 处有一个金币。

你可以选择从任意一个节点出发,你可以收集距离当前节点距离为 2 以内的所有金币,或者移动到当前节点的相邻节点。你需要收集完所有的金币并且最后要返回出发的节点,返回你至少要经过的边数。

比如 示例 1 中,你从节点 2 出发,收集节点 0 处的金币,移动到节点 3 ,收集节点 5 处的金币,然后移动回节点 2。你一共经历了边 2——33——2,所以返回 2,你可以验证这是经历的最少的边数。

示例 1


解题思路

方法一:拓扑排序

我们要经历尽可能少的边来拿完所有的金币,因此一些不必要的边就可以不走,对于那些 “最外侧的” 没有金币的节点,我们不走就好了。而那些 “最外侧” 的节点就是树的叶子节点。

我们可以利用 度数 来判断 “最外侧”,将度数为 1 的节点认定是 “最外侧” 的节点,也就是叶子节点,对于去除了没有金币的叶子节点之后漏出的新的没有金币的叶子节点,同样是 “最外侧” 的节点,我们也要去除掉。从度数为 1 的节点出发,迭代去找度数为 1 的节点进行相应的操作,正是 拓扑排序

因为,树中一共有 n-1 条边,有 “最外侧” 节点的边不用走,所以在拓扑排序的时候同步更新剩余的边数 left_edges

经过第一次拓扑排序处理,现在树中的叶子节点都是包含金币的节点了,因为 “你可以收集距离当前节点距离为 2 以内的所有金币”,所以目前的叶子节点及其父节点都不需要走,我们也可以使用拓扑排序的思想砍掉不需要走的边。

我们只需要砍掉 叶子节点——叶节点的父节点 以及新漏出来的 叶子节点——叶节点的父节点 这两类边,因此,可以使用数组来模拟拓扑排序(我们只需要从当前叶子节点向上再找一层)。具体地:

  • 首先将叶子节点存入数组 nodes 中;
  • 接着 left_edges - nodes.size() 模拟砍掉不必要的边;
  • 然后遍历 ndoes,枚举数组 nodes 中的节点 x 的相邻节点 y,如果 --degree[y] == 1,则删除 x——y 之间的边即 --left_edges

最后剩下的 left_edges 就是需要经历的边,因为 “你需要收集完所有的金币并且最后要返回出发的节点”,所以最后的答案为 2 * left_edges

特别地,如果所有点都要被删除,那么当剩下两个点时,这两个点之间的边我们会删除两次,这会导致剩余边数等于 -1,而此时答案应该是 0。所以最后答案要和 0 取最大值。

以上内容部分参考 拓扑排序(Python/Java/C++/Go/JS/Rust)。

实现代码

class Solution {
public:
    int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {
        int n = coins.size();
        vector<int> degree(n);
        vector<vector<int>> graph(n);
        for (auto edge : edges) {
            int x = edge[0], y = edge[1];
            // 统计节点度数
            ++ degree[x];
            ++ degree[y];
            // 建边
            graph[x].push_back(y);
            graph[y].push_back(x);
        }

        int left_edges = n - 1;
        queue<int> que;
        for (int i = 0; i < n; ++i) {
            if (degree[i] == 1 && coins[i] == 0) {
                que.push(i);
            }
        }
		// 模拟删除不含金币的叶子节点以及新漏出的不含金币的叶子节点
        while (!que.empty()) {
            int x = que.front(); que.pop();
            -- left_edges;
            for (int y : graph[x]) {
                if (--degree[y] == 1 && coins[y] == 0) {
                    que.push(y);
                }
            }
        }

        vector<int> nodes;
        for (int i = 0; i < n; ++i) {
            if (degree[i] == 1 && coins[i] == 1) {
                nodes.push_back(i);
            }
        }
        left_edges -= nodes.size();
        
		// 模拟删除含金币的叶子节点以及新漏出的一层叶子节点
        for (int x : nodes) {
            for (int y : graph[x]) {
                if (--degree[y] == 1)
                    --left_edges;
            }
        }
        return max(left_edges *2, 0);
    } 
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为树中节点个数。

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

目前最流行的无人机摄影测量软件有哪些?各有什么特点?

文章目录 1. Pix4Dmapper2. PhotoScan3. ContextCapture4. 天工GodWork5. Trimble Inpho6. IMAGINE Photogrammetry7. 大疆智图 推荐阅读&#xff1a;《无人机航空摄影测量精品教程》 包括&#xff1a;无人机航测外业作业流程&#xff08;像控点布设、航线规划、仿地飞行、航拍…

滚雪球学Java(30):多维数组:定义和初始化一次搞定

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

spring boot 八、 sharding-jdbc 分库分表 按月分表

在项目resources目录下新建com.jianmu.config.sharding.DateShardingAlgorithm 文件 新增yaml配置 数据源 spring:shardingsphere:props:sql:#是否在日志中打印 SQLshow: true#打印简单风格的 SQLsimple: truedatasource:names: pingxuanlogpingxuanlog:type: com.alibaba.dru…

【20230921】关于sing-box命令行程序开机自启动运行(Windows、Linux)

1 背景 sing-box是一个命令行程序&#xff0c;官网给出的教程是复制链接到Git Bash&#xff08;windows&#xff09;或终端运行&#xff08;Linux&#xff09;。每次开机都进行复制运行是一件繁琐的事情。 复制的内容其实就是下次并运行shell脚本&#xff0c;其实系统只需要运…

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据&#xff0c;一季度&#xff0c;光是抖音&#xff0c;旅游达人发布视频数量就高达175万条&#xff0c;播放量1350亿次&#xff0c;收获27亿次点赞。在这一趋势下&#xff0c;许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…

openGauss天津用户组招募正式启动,欢迎报名

openGauss天津用户组招募正式启动&#xff0c;欢迎报名&#xff01; openGauss用户组(openGauss User Group&#xff0c;简称oGUG)是一个让openGauss用户就技术特性、最佳实践、运营进展等方向交流的开放性本地社区。oGUG致力于构建一个开放、多元、包容的 openGauss城市用户交…

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

Java中运用BigDecimal对字符串的数值进行加减乘除等操作

系列文章目录 SpringBootVue3实现登录验证码功能 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09; 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 List&#xff1c;HashMap&#xff1c;Str…

rv1126-rv1109-驱动方法

1.简单写一下, 在根目录下修改指定编译 指定uboot 指定kernel的config 指定DTS

防静电离子风扇的应用及优点

防静电静电离子风扇是一种用于消除静电的设备&#xff0c;它可以通过离子化原理将静电荷离子化&#xff0c;从而达到静电的效果。防静电静电离子风扇通常采用离子风扇的形式&#xff0c;通过离子化原理将静电荷离子化&#xff0c;从而消除静电。 防静电静电离子风扇的工作原理…

Redis 持久化之 RDB 与 AOF 详解

Redis 持久化 我们知道Redis的数据是全部存储在内存中的&#xff0c;如果机器突然GG&#xff0c;那么数据就会全部丢失&#xff0c;因此需要有持久化机制来保证数据不会因为宕机而丢失。Redis 为我们提供了两种持久化方案&#xff0c;一种是基于快照&#xff0c;另外一种是基于…

数据结构与算法:排序算法(1)

目录 冒泡排序 思想 代码实现 优化 鸡尾酒排序 优缺点 适用场景 快速排序 介绍 流程 基准元素选择 元素交换 1.双边循环法 使用流程 代码实现 2.单边循环法 使用流程 代码实现 3.非递归实现 排序在生活中无处不在&#xff0c;看似简单&#xff0c;背后却隐藏…

vue 多环境文件配置(开发,测试,生产)

1.经常我们在开发时候会有不同环境&#xff0c;要代理的路由等等都会出现不同 配置一下三个文件打包的时候&#xff0c;执行三个不同的指令就会打包不同的环境 npm run build:dev npm run build:test npm run build:prodpackage.json 中配置scripts 指令 以,env.development…

Qt DoubleSlider双滑块支持float变化的控件,以及单滑块float控件

Qt DoubleSlider 双滑块支持float变化的控件&#xff0c;以及单滑块float控件 - 一杯清酒邀明月 - 博客园 (cnblogs.com)https://www.cnblogs.com/ybqjymy/p/13813001.html参考别人的分享&#xff0c;双滑块 看一下效果&#xff1a;

【力扣每日一题】2023.9.21 收集树中金币

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一棵树&#xff0c;不过这棵树不是普通的树&#xff0c;而是无向无根树。给我们一个二维数组表示节点之间的连接关系&#xff…

Canal 实现MySQL与Elasticsearch7数据同步

1 工作原理 canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 dump协议 MySQL master 收到 dump 请求&#xff0c;开始推送 binary log 给 slave (即 canal ) canal 解析 binary log 对象(原始为 byte 流) 优点&…

OmniPlan Pro 4.6(Mac项目流程管理工具)

OmniPlan Pro 是 The Omni Group 为 macOS 和 iOS 操作系统开发的项目管理软件。它允许用户创建和管理复杂的项目、定义任务、分配资源、跟踪进度和生成报告。OmniPlan Pro 包括甘特图、网络图、关键路径分析、资源均衡和成本跟踪等功能。 借助 OmniPlan Pro&#xff0c;用户可…

在月球上看地球和太阳是怎么转的?

文章目录 参数初始化运动模型绝对坐标系以太阳和地球为中心以月球为坐标原点 参数初始化 众所周知&#xff0c;地球围绕太阳转&#xff0c;月球围绕地球转。但在地球上看&#xff0c;月亮和太阳都绕着地球转&#xff0c;那么如果我们是土生土长的月球人&#xff0c;我们看到的…

记-数据库事务隔离级别

记-数据库事务隔离级别 一、MySQL数据库默认隔离级别二、JDBC连接的事务隔离级别1. 查看JDBC连接的事务隔离级别2. JDBC连接的事务隔离级别设置过程 三、修改JDBC连接的事务隔离级别1. 全局修改2. 局部修改 一、MySQL数据库默认隔离级别 MySQL数据库默认事务隔离级别为REPEATAB…