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

news2025/5/24 9:09:25

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

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

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

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

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

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

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

如果我们把整棵树剪到只剩下我们必须要走到的节点之后,答案就剩下节点数-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;
    }
};

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

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

相关文章

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…

微服务生态系统:使用Spring Cloud构建分布式系统

文章目录 什么是微服务&#xff1f;为什么选择Spring Cloud&#xff1f;Spring Cloud的关键组件示例&#xff1a;构建一个简单的微服务步骤1&#xff1a;创建Spring Boot项目步骤2&#xff1a;配置Eureka服务发现步骤3&#xff1a;创建REST控制器步骤4&#xff1a;运行项目步骤…

【R语言】完美解决devtools安装GitHub包失败的问题(以gwasglue为例)

Rstudio&#xff0c;R4.3.1&#xff0c;命令在Rstudio的命令行即console中运行。 文章目录 一、问题复述二、分析三、解决四、安装示例&#xff1a;gwasglue 一、问题复述 使用devtools安装一个github的包。 devtools&#xff1a; devtools 是 R 语言中一个非常有用的包&…

netty之数据读写源码阅读

数据读写 write 从client端的写开始看 client与服务端建立完connect后可以从future里拿到连接的channel对象。这里的channel是io.netty.channel.Channel对象。 调用其channel.writeAndFlush(msg);方法可以进行数据发送。 writeAndFlush会调用pipeline的writeAndFlush方法 …

目标检测算法改进系列之Neck添加渐近特征金字塔网络(AFPN模块)

渐近特征金字塔网络&#xff08;AFPN模块&#xff09; 在目标检测任务中&#xff0c;多尺度特征对具有尺度差异的目标进行编码具有重要意义。多尺度特征提取的常用策略是采用经典的自顶向下和自底向上的特征金字塔网络。 然而&#xff0c;这些方法存在特征信息丢失或退化的问…

【音视频】ffplay源码解析-FrameQueue队列

帧队列架构位置 结构体源码 FrameQueue结构体 /* 这是一个循环队列&#xff0c;windex是指其中的首元素&#xff0c;rindex是指其中的尾部元素. */ typedef struct FrameQueue {Frame queue[FRAME_QUEUE_SIZE]; // FRAME_QUEUE_SIZE 最大size, 数字太大时会占用大量的…

第二证券:什么是a股b股?

在我国的股市中&#xff0c;我们经常会听到“A股”和“B股”这两个名词。那么&#xff0c;终究什么是A股和B股呢&#xff1f; 首先&#xff0c;A股全称为“A股票”&#xff0c;是指在我国境内上市的以人民币计价的股票。A股首要面向国内出资者&#xff0c;只要具有必定条件的内…

如何快速检测代理IP质量?方法与工具全干货

一直以来&#xff0c;IP代理都是出海跨境业务的刚需。质量好的IP代理&#xff0c;除了在跨境业务产生巨大作用&#xff0c;在SEO监控、爬虫抓取、市场研究等领域也发挥着很大的作用。但是&#xff0c;对于IP代理的质量检测是我们选择高标准IP代理的一句&#xff0c;我们一般都会…

美国零售电商平台Target,值得入驻吗?如何入驻?

Target 是美国最大的零售商之一&#xff0c;在品牌出海为大势所趋的背景下&#xff0c;它在北美电商中的地位节节攀升。Target 商店在众多垂直领域提供各种价格实惠的自有品牌&#xff0c;吸引越来越多的跨境商家入驻&#xff0c;如美妆、家居、鞋服、日用百货等&#xff0c;随…

Mybatis学习笔记12 分页插件

Mybatis学习笔记11 缓存相关_biubiubiu0706的博客-CSDN博客 (5) select distinct top(<取数说明>) <选择 列表> (1) from <表1> <连接类型> join <表2> ON <连接条件> (2) where <筛选条件> (3) group by <分组条件> (4) havi…

linux下链接

linux下链接用法 ln链接格式与介绍 linux下链接用法一、链接的使用格式二、链接的介绍 一、链接的使用格式 链接&#xff1a; 格式&#xff1a; ln 源文件 链接文件 硬链接 ln -s 源文件 链接文件 软连接 硬链接文件占磁盘空间 但是删除源文件不会影响硬链接文件 软链接文件不…

秒杀场景设计

1.活动页面静态化处理 没有到活动时间页面静态化处理避免访问服务端 2.使用cdn让用户可以获取就近的所需静态页面内容 3.限制用户同一时间点击次数 4.把商品库存提前放入redis&#xff0c;秒杀请求直接操作redis防止操作直接落库打崩数据库 5.使用lua脚本操作redis保证操作…

transformer系列2---transformer架构详细解析

transformer详细解析 Encoder1 输入1.1 Embedding 词嵌入1.1.1 Embedding 定义1.1.2 几种编码方式对比1.1.3 实现代码 1.2 位置编码1.2.1 使用位置编码原因1.2.2 位置编码方式1.2.3 位置编码代码 2 注意力 Attention2.1 自注意力self-attention2.1.1 QKV含义2.1.2 自注意力公式…

微信图文如何替换成自己的二维码?

二维码样式中的二维码目前都是小蚂蚁的二维码&#xff0c;如何替换成自己的二维码&#xff0c;其实也很简单&#xff0c;就像替换样式中的图片一样&#xff0c;首先点击二维码&#xff0c;选择工具条中的“换图”&#xff0c;然后在弹出来的框中填入二维码图片的链接地址或者直…

招股书更新9版终上市,飞沃科技能否躲过风电红利后的黯淡?

文丨熔财经 作者丨文泽 碳达峰、碳中和成为主旋律目标下&#xff0c;作为可再生能源主力的风电产业迎来了发展的“黄金时代”。与新能源相关的上下游企业也赚的“盆满钵满”。 在此背景下&#xff0c;飞沃科技(301232.SZ)历经4轮问询&#xff0c;更新9版招股书终于登陆资本市…

Command not found 解决方法

前言&#xff1a;要更新code上服务器用GUI失败&#xff0c;$ patch_delivery_gui&#xff0c;报错&#xff1a;patch_delivery_gui: command not found&#xff0c;上次编TA也是这个问题 写了个脚本&#xff1a;这个脚本会先检查ifconfig、firewall-cmd和vim命令是否可用&#…

ExcelServer EXCEL服务器使用- 用户、角色权限配置

Excel文件服务器搭建 搭建Excel服务器 1、登录 默认 用户名 Admin 密码 3 2、角色管理 添加修改角色 角色配置在 系统管理->角色.fexm文件夹下 可以像修改excel文件一样 修改角色 3、用户管理 添加修改用户 用户的修改在 系统管理->用户.fexm 可以像excel一样编辑用户…