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

2023-11-18

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一棵树,不过这棵树不是普通的树,而是无向无根树。给我们一个二维数组表示节点之间的连接关系,以及一个一维数组表示每个节点是否有金币。

我们可以从任何一个节点出发,并且可以收集距离两格的节点的金币,每次可以移动到相邻的节点。问我们要收集完所有的金币并且最终要回到起点,最少需要移动几次。

首先,题目说了这是一棵树,所以是不存在环的,两个节点之间连通的路径只会有唯一的一条。

因此我们不管选择哪一个节点当起点,都是可以到达任意一个节点的。

我们需要获取所有的金币,那么如果一个节点没有金币,并且这个节点是叶子节点,那么我们是不是可以将这个节点直接从树中移除,因为我们根本不需要走到这个节点。

我们把能删除的节点都删除了,是不是就说明剩下的节点都是我们需要走到或是收集金币的节点。

如果我们把整棵树剪到只剩下我们必须要走到的节点之后,答案就剩下节点数-1再乘2了。

为什么呢?

题目要求我们必须在收集完金币之后再返回原点,我们有n个必须到达的节点,由于这是树,是没有环的,因此节点之间的连线一共是n-1条。一来一回每个线段要走两次,所以答案是(n-1)*2

问题就变成了我们怎么把树的节点剪到只剩下我们必须要走的节点。

首先,没有金币的叶子节点我们是可以先删除的。判断依据也简单,如果一个节点没有金币,并且和这个节点连接的其他节点只有一个,那么它就是没有金币的叶子节点,可以把它删除。并且删除某个节点之后可能会诞生出新的无金币叶子节点,因此我们删除节点之后还需要判断一下与这个节点连接的节点是否也是无金币叶子节点,也就是延伸性地删除节点。

那么怎么删除呢,我们可没有构建出树来。

我们其实不需要真的删除。我们之前分析过了,答案就是剪枝后的节点数减1再乘2。我们可以当成一开始的树就是我们剪枝后的树,把答案初始化成总的节点数减1再乘2。每次我们删除一个节点就等于是移除了一个线段,把答案减2即可,这样就当成是删除一个节点了。

初步移除了没有金币的叶子节点之后剩下的节点就是我们要达到的节点或者是要收集金币的节点了。

我们把剩下的树看成是图,那么图边缘一圈的节点一定都是有金币的。

我们收集金币的时候可以距离金币节点两格,因此我们可以再一次把图的外围两层节点删除,不过删除是有条件的,最外层的叶子节点可以直接删除,不过第二层的节点我们得判断删除了外层节点后,第二层的节点是不是叶子节点,如果是我们才可以删除。

最终我们每次删除节点之后,都将答案-2,最终就是要返回出去的答案了。

不过最后还有一个问题,那就是如果整个树都是可以移除的,那么根据我们刚才说的每删除一个节点就把答案-2,而我们答案初始化是总的节点数减1再乘2,这样答案就变成了-2,因此最后我们做个判断,如果答案小于0,我们就返回0,反之就正常返回求出的答案。

代码:

class Solution {
public:
    unordered_map<int,vector<int>>pic;  //记录节点连接图
    unordered_map<int,int>rel;          //记录每个节点的邻接数量关系
    int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {
        int n=coins.size();
        int res=2*(n-1);    //答案初始化成图中线段数乘2,表示每个线段都要走两边
        //建图
        for(auto& edge:edges){
            if(pic.find(edge[0])==pic.end()) pic[edge[0]]=vector<int>(0);
            if(pic.find(edge[1])==pic.end()) pic[edge[1]]=vector<int>(0);
            pic[edge[0]].push_back(edge[1]);
            pic[edge[1]].push_back(edge[0]);
            rel[edge[0]]++;rel[edge[1]]++;
        }
        queue<int> q;
        
        //删除无金币的叶子节点(可延伸)
        for(int i=0;i<n;i++){
            if(coins[i]==0 && rel[i]==1) q.push(i);
        }
        while(!q.empty()){
            res-=2;         //减少一个线段,答案减2,因为默认每个线段走两次.
            int cur=q.front();q.pop();
            for(int i:pic[cur]){
                if(--rel[i]==1&&coins[i]==0) q.push(i);
            }
        }

        //确定到有金币的叶子节点的范围.
        for(int i=0;i<n;i++){
            if(coins[i]==1&&rel[i]==1) q.push(i);
        }
        res-=2*q.size();
        //减少叶子节点,不延伸(因为可以收集距离两格的金币,所以可以在边缘处再缩小一圈)
        while(!q.empty()){
            int x=q.front();q.pop();
            for(int j:pic[x]){
                if(--rel[j]==1) res-=2;
            }
        }

        if(res>0) return res;
        return 0;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【力扣每日一题】2023.9.21 收集树中金币 的相关文章

  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • std::bind 重载解析

    下面的代码工作正常 include
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)

    基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务 在构建性能良好的分类器时 广泛依赖于使用音频功能的模型 本文提出了一种新的深度双循环编码器模型 该模型同时利用文本数据和音频信号来更好地理解语音数据 由于情感对话是由声
  • EA 的类型/EA 智能交易的介绍(自动化交易/程序化交易/量化交易)

    EA 的类型 EA 智能交易的介绍 自动化交易 程序化交易 量化交易 EA 的类型 1 趋势类 最常见也是最成熟的类型 趋势类 最为主流的 EA 类型 一般根据各种指标和策略来进行出入场操作 2 网格类 网络类的特征 就是单子很多 而且浮亏
  • python引入同一目录下的py文件

    存在一个目录bert base 其中有两个文件 admin py和dealcode py 如果要在admin py中引用dealcode py 则在admin py文件中加一行 from bert base dealcode import
  • 老话新谈之缓存一致性

    前言 缓存一致性常见的更新策略也比较多 如先更新数据库再更新缓存 先删缓存再更新数据库等等 我在理解的时候有些混乱 所以这个文章提供了一些理解上的技巧去理解缓存一致性 为什么会有缓存一致性的问题 缓存与数据库是两套中间件 存在网络抖动之类的
  • java springBoot实现QQ机器人,定时发送信息,自动回复功能

    文末有源码链接 1 准备一个空白springBoot项目 自行百度创建 2 引入simple robot依赖
  • CUJ:标准库:Allocator能做什么?

    http dev csdn net Develop article 17 17946 shtm CUJ 标准库 Allocator能做什么 选择自 taodm 的 Blog http www cuj com experts 1812 aus
  • Qt QModbusTcpServer类

    1 概述 QModbusTcpServer类表示使用TCP服务器与Modbus客户端进行通信的Modbus服务器 Header include
  • 《动手学深度学习 Pytorch版》 3.6 softmax回归的从零开始实现

    import torch from IPython import display from d2l import torch as d2l batch size 256 batch size 设为256 train iter test it
  • PyQt5的tools目录下找不到designer解决方法

    问题描述 用pip安装 pyqt5 和 pyqt5 tools 后 在配置pycharm的external tools的时候找不到designer exe 尝试方法 重装sip pyqt5 以及pyqt5 tools 没有用 安装不同版本的
  • uniApp和微信小程序好看的我的页面(有源码)

    uniApp和微信小程序好看的我的页面 有源码 1 先睹为快 未登录状态 以登录 uniapp源码
  • ReID:Harmonious Attention Network for Peson Re-Identification 解读

    最近阅读了CVPR2018的这篇论文 Harmonious Attention Network for Peson Re Identification 论文还是比较容易理解的 下面就简单的解读一下 纯属个人观点 有不同意见的欢迎评论与我探讨
  • 编写程序: 从键盘分别输入年、月、日,判断这一天是当年的第几天

    编写程序 从键盘分别输入年 月 日 判断这一天是当年的第几天 注 判断一年是否是闰年的标准 1 可以被4整除 但不可被100整除或 2 可以被400整除 import java util Scanner public class Test
  • 5G MEC在5G网络中的部署-与UPF的关系

    MEC主机部署在边缘或者核心数据网络中 而UPF负责牵引用户平面流量到目标MEC应用所在的数据网络 网络运营商除了选择数据网络和UPF之外 还需要根据技术和商业因素 例如 站点设施 应用需求 用户负载实测值或估算值 来选择物理计算资源的部署
  • 95-38-050-Buffer-UnpooledHeapByteBuf

    文章目录 1 总述 1 1 局部图 1 2 概述 2 私有字段 3 构造方法 4 设置容量方法 capacity 1 总述 1 1 局部图 1 2 概述 该Bytebuf的底层为不使用对象池技术的JAVA堆字
  • Linux系统查看磁盘可用空间的5个命令

    大家好 我是良许 工作中 经常会遇到磁盘爆满的情况 尤其是一台服务器运行了 N 年之后 里面会充满各种各样垃圾文件 比如 编译产生的中间文件 打包的镜像文件 日志文件 等等 别问我怎么知道 我上家公司服务器就是这样的 我需要每天去删除一些没
  • C++ Primer 学习笔记 第二章 变量和基本类型

    C 是一种静态数据类型语言 它的类型检查发生在编译时 基本内置类型 C 定义了一套包括算数类型和空类型在内的基本数据类型 算数类型 整型 字符 整型数 布尔值 和浮点数 空类型 不对应具体的值 仅用于特殊场合 常见的有函数不返回任何值时用空
  • strlen sizeof详尽分析

    1 char a qwert cout lt
  • 【操作系统】王道考研 p48 文件的逻辑结构

    文件的逻辑结构 知识总览 所谓 逻辑结构 就是在用户看来文件内部的数据如何组织 所谓 物理结构 就是操作系统看来文件的数据如何在外存存放 无结构文件 按文件是否有结构分类 可以分为无结构文件 有结构文件 无结构文件 文件内部的数据就是一系列
  • Cookie 和 Session 详解 及实现用户登陆功能

    Cookie是啥 浏览器提供的在客户端存储数据的一种机制 由于浏览器禁止了网页中的代码直接访问磁盘的文件因此要想再网页中实现数据的持久化存储 就可以使用Cookie这样的机制 Cookie 里面存什么 键值对结构 键和值都是程序猿自定义的
  • 【力扣每日一题】2023.9.21 收集树中金币

    目录 题目 示例 分析 代码 题目 示例 分析 题目给我们一棵树 不过这棵树不是普通的树 而是无向无根树 给我们一个二维数组表示节点之间的连接关系 以及一个一维数组表示每个节点是否有金币 我们可以从任何一个节点出发 并且可以收集距离两格的节