OJ练习第178题——收集树中金币

2023-09-21 11:10:31

收集树中金币

力扣链接: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:
在这里插入图片描述
输入:coins = [1,0,0,0,0,1], edges = [[0,1],[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:从节点 2 出发,收集节点 0 处的金币,移动到节点 3 ,收集节点 5 处的金币,然后移动回节点 2 。

示例2
在这里插入图片描述
输入:coins = [0,0,0,1,1,0,0,1], edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[5,6],[5,7]]
输出:2
解释:从节点 0 出发,收集节点 4 和 3 处的金币,移动到节点 2 处,收集节点 7 处的金币,移动回节点 0 。

官解思路

在这里插入图片描述
这一步可以使用基于广度优先搜索的拓扑排序解决。我们首先将所有「叶节点」加入队列中,随后不断从队列中取出节点,将它标记为删除,并判断其唯一相邻的节点是否变为「叶节点」。如果是,就将相邻的节点也加入队列中。
在这里插入图片描述
这一步同样可以使用基于广度优先搜索的拓扑排序解决。我们进行 222 次如下的操作:首先将所有「叶节点」加入初始队列中,随后不断从初始队列中取出节点,将它标记为删除。
在这里插入图片描述

Java代码

class Solution {
    public int collectTheCoins(int[] coins, int[][] edges) {
        int n = coins.length;
        List<Integer>[] g = new List[n];
        for(int i = 0; i < n; i++) {
            g[i] = new ArrayList<Integer>();
        }
        int[] degree = new int[n];
        for(int[] edge : edges) {
            int x = edge[0], y = edge[1];
            g[x].add(y);
            g[y].add(x);
            degree[x]++;
            degree[y]++;
        }
        int rest = n;
        /* 删除树中所有无金币的叶子节点,直到树中所有的叶子节点都是含有金币的 */
        Queue<Integer> queue = new ArrayDeque<Integer>();
        for(int i = 0; i < n; i++) {
            if(degree[i] == 1 && coins[i] == 0) {
                queue.offer(i);
            }
        }
        while(!queue.isEmpty()) {
            int u = queue.poll();
            degree[u]--;
            rest--;
            for(int v : g[u]) {
                degree[v]--;
                if(degree[v] == 1 && coins[v] == 0) {
                    queue.offer(v);
                }
            }
        }
        /* 删除树中所有的叶子节点, 连续删除2次 */
        for(int x = 0; x < 2; x++) {
            queue = new ArrayDeque<Integer>();
            for(int i = 0; i < n; i++) {
                if(degree[i] == 1) {
                    queue.offer(i);
                }
            }
            while(!queue.isEmpty()){
                int u = queue.poll();
                degree[u]--;
                rest--;
                for(int v : g[u]) {
                    degree[v]--;
                }
            }
        }
        return rest == 0 ? 0 : (rest - 1) * 2;
    }
}
更多推荐

Vue路由与nodejs下载安装及环境变量的配置

目录前言一、Vue路由1.路由简介是什么作用应用场景2.SPA简介SPA是什么SPA的优点注意事项3.路由实现思路1.引入路由的js依赖2.定义组件3.定义组件与路径的对应关系4.通过路由关系获取路由对象router5.将路由对象挂载到实例中6.触发路由事件的按钮7.定义锚点---路由内容完整案例二、NodeJS下载安

Java工具类:HttpUtil项目实战

步骤1.导入maven依赖2.编写工具类导入maven依赖<!--HttpClinet核心包--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</ver

【Hash表】判断字母异位词-力扣 242

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kuan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kaf

计网第五章(运输层)(五)(TCP拥塞控制)

目录一、基本概念二、拥塞控制算法慢开始:拥塞避免:快重传:快恢复:一、基本概念若对网络中某一资源的需求超过了该资源所能提供的可用部分(供不应求),网络性能就会变坏。在计算机网络中的带宽、交换节点中的缓存和处理机等都是网络的资源。如果出现拥塞而不控制,整个网络的吞吐量(单位时间内从网络输出的分组数量)会随着输入负荷的增大

数据结构——查找(二叉排序树)

文章目录前言一、二叉排序树构造二叉排序树步骤构造二叉排序树步骤图二叉排序树的查找二叉排序树查找递归算法二叉排序树查找非递归算法二叉排序树的插入二叉排序树插入结点——递归算法二叉排序树插入结点——非递归算法二叉排序树的删除总结前言二叉排序树查找定义二叉排序树构造二叉排序树查找递归和非递归算法二叉排序树插入递归和非递归算法

【Python】pyecharts 模块 ⑥ ( 绘制柱状图 | pyecharts 绘制柱状图步骤 | 柱状图 x 轴 / y 轴 翻转 | 柱状图数据标签位置设置 )

文章目录一、pyecharts绘制基础柱状图1、pyecharts绘制柱状图步骤2、代码示例-pyecharts绘制柱状图二、柱状图其它设置1、柱状图x轴/y轴翻转2、柱状图数据标签位置设置pyecharts画廊网站:https://gallery.pyecharts.org/#/在该网站可查看官方示例一、pyecha

关于Allegro17.4 3d模型大小不匹配问题解决

文章目录问题概述问题原因解决办法问题概述Allegro17.4版本采用3DCanvas工具进行3D模型的映射,映射后,无需保存任何映射文件,只要指定好step文件路径,即可将模型映射信息保存在pcb封装文件中,方便快捷。映射流程如下:打开Allegro软件,菜单选择Setup->UserPreferencesEdito

基于Java+SpringBoot+Vue的在线音乐网站设计和实现

基于Java+SpringBoot+Vue的在线音乐网站设计和实现源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》源码获取源码传送入口前言大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已

介绍Spring Security框架,以及如何使用它实现应用程序的安全性

文章目录什么是SpringSecurity?SpringSecurity的工作原理如何使用SpringSecurity构建安全的应用程序步骤1:添加SpringSecurity依赖步骤2:配置SpringSecurity步骤3:配置安全性规则步骤4:创建用户和角色步骤5:创建自定义登录页面步骤6:运行应用程序总结🎈个

又一职业技术技能标准官宣!

为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定,工业和信息化部教育与考试中心联合有关部门组织并制定了《研发效能(DevOps)工程师国家职业技术认证》。其中包含两个方

美团笔试-小美的元素删除

小美的元素删除小美有一个数组,她希望删除k个元素,使得剩余的元素两两之间互为倍数关系。你能告诉小美有多少种删除方案吗?由于答案过大,请对10^9+7模。输入描述第一行输入两个整数n,k(1<=k<=n<=10^3)表示数组长度,删除的元素数量。第二行输入n,k个整数表示数组a(1<=ai<=10^9)。保证给定的数组中

热文推荐