2023-09-21 LeetCode每日一题(收集树中金币)

2023-09-21 22:26:02

2023-09-21每日一题

一、题目编号

2603. 收集树中金币

二、题目链接

点击跳转到题目位置

三、题目描述

给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。再给你一个长度为 n 的数组 coins ,其中 coins[i] 可能为 0 也可能为 1 ,1 表示节点 i 处有一个金币。

一开始,你需要选择树中任意一个节点出发。你可以执行下述操作任意次:

  • 收集距离当前节点距离为 2 以内的所有金币,或者
  • 移动到树中一个相邻节点。
    你需要收集树中所有的金币,并且回到出发节点,请你返回最少经过的边数。

如果你多次经过一条边,每一次经过都会给答案加一。

示例 1
在这里插入图片描述

示例 2:
在这里插入图片描述
提示:

  • n == coins.length
  • 1 <= n <= 3 * 104
  • 0 <= coins[i] <= 1
  • edges.length == n - 1
  • edges[i].length == 2
  • 0 <= ai, bi < n
  • ai != bi
    edges 表示一棵合法的树。

四、解题代码

class Solution {
public:
    int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {
        int n = coins.size();
        vector<vector<int>> g(n);
        vector<int> degree(n);
        for (const auto& edge: edges) {
            int x = edge[0], y = edge[1];
            g[x].push_back(y);
            g[y].push_back(x);
            ++degree[x];
            ++degree[y];
        }

        int rest = n;
        {
            /* 删除树中所有无金币的叶子节点,直到树中所有的叶子节点都是含有金币的 */
            queue<int> q;
            for (int i = 0; i < n; ++i) {
                if (degree[i] == 1 && !coins[i]) {
                    q.push(i);
                }
            }
            while (!q.empty()) {
                int u = q.front();
                --degree[u];
                q.pop();
                --rest;
                for (int v: g[u]) {
                    --degree[v];
                    if (degree[v] == 1 && !coins[v]) {
                        q.push(v);
                    }
                }
            }
        }
        {
            /* 删除树中所有的叶子节点, 连续删除2次 */
            for (int _ = 0; _ < 2; ++_) {
                queue<int> q;
                for (int i = 0; i < n; ++i) {
                    if (degree[i] == 1) {
                        q.push(i);
                    }
                }
                while (!q.empty()) {
                    int u = q.front();
                    --degree[u];
                    q.pop();
                    --rest;
                    for (int v: g[u]) {
                        --degree[v];
                    }
                }
            }
        }

        return rest == 0 ? 0 : (rest - 1) * 2;
    }
};

五、解题思路

(1) 运用两次拓扑排序

更多推荐

互联网医院|互联网医院系统引领医疗科技新风潮

互联网的迅速发展已经改变了人们的生活方式,而医疗领域也不例外。近年来,互联网医院应运而生,为患者和医生提供了更便捷、高效的医疗服务。本文将深入探讨互联网医院的系统特点、功能以及未来的发展方向,为您展现医疗行业的新时代。互联网医院的系统特点使其与传统医疗方式截然不同。首先,互联网医院做到了线上线下无缝对接,通过互联网技术

buuctf web [极客大挑战 2019]Http

进入题目上下翻找了一下,没有什么突破口检查了一下源码,有一个跳转页面点击页面,跳转到了新的地方新页面里没有别的跳转接口但是页面中有提示:Itdoesn'tcomefrom'https://Sycsecret.buuoj.cn'打开burp页面提示要求来自https://Sycsecret.buuoj.cn所以,我们添加

万字长文详解Webpack5高级优化

本文从4个角度对webpack和代码进行了优化:1.提升开发体验使用SourceMap让开发或上线时代码报错能有更加准确的错误提示。2.提升打包构建速度使用HotModuleReplacement让开发时只重新编译打包更新变化了的代码,不变的代码使用缓存,从而使更新速度更快。使用OneOf让资源文件一旦被某个loade

Neutron — API Service Web 开发框架

目录文章目录目录WSGIWSGI的工作原理environ参数start_resposne参数WSGI的中间件WSGIWeb开发框架OpenStack中的应用案例进程入口WSGIApplication加载Paste/PasteDeployRoutesWebObWSGIServer启动WSGIWSGI(WebServerG

【软考中级】网络工程师:7.下一代互联网

IPv4问题与改进IPv4存在以下著名的问题:网络地址短缺(32位)以二进制数串表示,v4仅有43亿个地址,而IPv6有128位,且以十六进制数串表示。(现在还能用v4得益于NAT地址转换)地址分配不合理:IPv4中有1/3被美国占用了,其大型企业地址数比很多国家都多。路由速度慢:路由表日趋庞大,路由查找速度越来越慢。

ElasticSearch 5.6.3 自定义封装API接口

在实际业务中,查询elasticsearch时会遇到很多特殊查询,官方接口包有时不便利,特殊情况需要自定义接口,所以为了灵活使用、维护更新编写了一套API接口,仅供学习使用当前自定义API接口依赖elasticsearch5.6.3版本,其它版本自行测试修改源码同时为了更好的帮助读者使用,编写了一套查询文档,下载cas

在 Linux 上运行 macOS?OSX-KVM 助你梦想成真!| 开源日报 No.36

isocpp/CppCoreGuidelinesStars:39.4kLicense:NOASSERTIONC++CoreGuidelines是一个由BjarneStroustrup领导的协作项目,旨在帮助人们有效地使用现代C++。该指南侧重于较高级别的问题,如接口、资源管理、内存管理和并发性,并鼓励应用程序架构和库设

docker学习2-基本指令

1、帮助命令dockerversion#版本信息dockerinfo#显示docker系统信息,镜像容器数量docker命令--help#帮助命令2、镜像命令dockerimages查看所有本地主机上的镜像dockerimages-a列出所有镜像dockerimages-q只显示镜像的iddockersearch+镜像

android可见即可说实现方案

依赖于科大讯飞的asr识别能力,使用Android无障碍服务获取页面文本作为热词,注册到讯飞api,注册过后语音识别到热词的asr返回,利用WindowManager和无障碍的点击实现可见即可说功能##&#x20;无障碍服务获取需要注册的热词```packagecom..model;importandroid.acce

设计模式之命令模式

文章目录智能生活项目需求命令模式基本介绍命令模式的原理类图命令模式解决智能生活项目命令模式的注意事项和细节智能生活项目需求看一个具体的需求我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,

opencv实现仿射变换

什么是仿射变换?代码实现importnumpyasnpimportcv2ascvimportmatplotlib.pyplotasplt#设置字体frompylabimportmplmpl.rcParams['font.sans-serif']=['SimHei']#图像的读取img=cv.imread("lena.p

热文推荐