leetcode 1443.Minimum Time to Collect All Apples in a Tree(收集苹果所需最短时间)

1、Ovirt 开源虚拟化平台安装 Ovirt虚拟化Node和Engine安装 阅读详情

在这里插入图片描述
给出节点个数n, edges是连接的边,[a,b]是连接的两个顶点。
hasApple表示第 i 个顶点上是否有苹果。

走一条边需要耗时1s, 从顶点0出发,最后回到顶点0,
问收集所有苹果所需最短的时间。

思路:

(1)DFS

可以把问题简化一下,
如果一个顶点,它的child有苹果,这个点必然会耗时2,因为要经过它进入child, 还要经过它返回顶点0.

如果一个顶点,它自己有苹果,那么也要耗时2,因为要走向它,还要返回上一级。

那么就可以DFS遍历,从叶子节点开始递归返回,child有苹果,+2,自己有苹果+2.
还要用一个visited记录每个节点是否已经被访问过。
例如图中的节点1,在进入4时它已经被访问过了,那么再进入5时它就不需要再+2。

出发点是0,所以节点0不需要+2.

该方法需要构建无向图。

class Solution {
    HashMap<Integer,List<Integer>> graph = new HashMap<>();
    HashSet<Integer> visited = new HashSet<>();

    public int minTime(int n, int[][] edges, List<Boolean> hasApple) {

        //make graph
        for(int[] edge : edges) {
            graph.putIfAbsent(edge[0], new LinkedList<>());
            graph.putIfAbsent(edge[1], new LinkedList<>());
            graph.get(edge[0]).add(edge[1]);
            graph.get(edge[1]).add(edge[0]);
        }

        return dfs(0, hasApple);
    }

    int dfs(int node, List<Boolean> hasApple) {
        visited.add(node);
        int res = 0;

        for(int child : graph.getOrDefault(node, new LinkedList<>())) {
            if(visited.contains(child)) continue;
            res += dfs(child, hasApple); 
        }

        if((res > 0 || hasApple.get(node)) && node > 0) res += 2;

        return res;
    }

(2)类似 Union-Find

前面已经说过,2种情况,

节点的child有苹果,时间+2,
节点自己有苹果,时间+2,
节点0除外,已访问过的节点除外。

刚刚的DFS是从上往下,但是是从下往上递归。

那是不是可以直接从下往上呢?

只需记录每个节点的parent, 然后从节点开始,不断访问它的parent,
节点自己有苹果,时间+2,同时它所有的parent的时间+2,
已访问过的和节点0除外。

    public int minTime(int n, int[][] edges, List<Boolean> hasApple) {

        int[] parent = new int[n];
        Arrays.fill(parent, -1);
        
        // Build tree like structure with each child pointing to its parent node
        // edge[0] is parent by default for edge[1]. 
        // If edge[1] is already assigned a parent, then make edge[1] a parent of edge[0]
        parent[0] = 0;
        for (int[] edge : edges) {
            if (parent[edge[1]] == -1) {
                parent[edge[1]] = edge[0];
            } else {
                parent[edge[0]] = edge[1];
            }
        }

        int timeSpent = 0;
        boolean[] visited = new boolean[n];
        visited[0] = true;

        for (int node = 1; node < n; ++node) {
            if (hasApple.get(node)) {
                for (int parentNode = node; !visited[parentNode]; parentNode = parent[parentNode]) {
                    visited[parentNode] = true;
                    timeSpent += 2;
                }
            }
        }

        return timeSpent;
    }
【学前须知】推荐阅读顺序 AUTOSAR学习笔记专栏文章推荐阅读顺序 阅读详情

相关推荐

Anaconda启动失败,一直在loading application的问题

实战基础新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本

Tristan的博客 2771

[leetcode] 1443. Minimum Time to Collect All Apples in a Tree

Description Given an undirected tree consisting of n vertices numbered from 0 to n-1, which has some apples in their vertices. You spend 1 second to walk over one edge of the tree. Return the minimum time in seconds you have to spend in order to collect al

Learning from the mistakes 303

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

【leetcode】1443. Minimum Time to Collect All Apples in a Tree

用递归 提交代码 class Solution { public int minTime(int n, int[][] edges, List<Boolean> hasApple) { TreeNode[] nodes=new TreeNode[n]; for(int i=0;i<n;i++) nodes[i]=new TreeNode(i); for(int[] e:edges

AXIMI的博客 400

(MATLAB)一维信号峰值检测findpeaks

一维信号波峰波谷检测,峰值、峰宽、到达时间计算。MATLAB自带的findpeaks函数能完成这一任务,在这里分享其基本用法与特殊用法。

HPC_ZY 2万+

OpenBmc开发2:构建开发环境

编译环境VMware + ubuntu 18.04 编译环境构建:参考OpenBmc开发1:构建开发环境 1、打开一个Ternimal,进入openbmc目录下 2、查看有哪些不同的编译配置 find meta-* -name local.conf.sample 可以看到如下编译配置 3、生成编译配置 插入TEMPLATECONF,上边查询到的配置有很多,但是有一些...

master 2万+

LeetCode 1443 Minimum Time to Collect All Apples in a Tree (dfs)

Given an undirected tree consisting ofnvertices numbered from0ton-1, which has some apples in their vertices. You spend 1 second to walk over one edge of the tree.Return the minimum time in seconds you have to spend to collect all apples in the tree,...

Tc的专栏 323

Unity中Newtonsoft.Json的使用(一)

在Unity中下载Newtonsoft.Json,并进行序列化和反序列化

洛苍离的博客 1万+

【Leetcode】1443. Minimum Time to Collect All Apples in a Tree

显然每棵子树是独立的,比如对于第一棵子树,我们可以先递归求解这棵子树上从树根出发,要采集所有苹果所需要的步数,接着,当且仅当该子树上有苹果,我们才需要将该子树的步数 + 2(因为从树根走到该子树根再返回需要两步)累加到最终答案。号节点出发采集所有苹果,问最少要多少步。子树是一定存在苹果的,否则如果。,每个节点至多一个苹果。

数学、算法爱好者的博客 271

直流无刷电机FOC控制算法 理论到实践 —— 理论(二)

在上一章节,我们对于FOC大体有了一个介绍,本博文将详细描述有关Clark变化、Park变化、反Park变化以及SVPWM的理论实现原理,也即相关数学运算实现。

爱出名的狗腿子 1万+

芒果YOLO11改进172:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1515

Leetcode 1443. Minimum Time to Collect All Apples in a Tree (python)

题目 解法1: 利用dfs,找出所有的在摘苹果的过程中会被访问的边。这些被访问的边数*2就是答案 这种做法需要保存当前路径,当发现当前路径包含苹果时,将这些边加入访问列表。这样做的坏处在于,每条边可能被加入多次,意味着时间复杂度的增加,事实证明这种做法确实不都快,刚刚过TLE的线。但利用字典或者set,还是可以不重复的记录摘苹果时需要被访问的边 class Solution: def minTime(self, n: int, edges: List[List[int]], hasApple: L

qq_37821701的博客 484

AD9613操作控制

输出250M时钟给AD9613,过FPGA ILA逻辑分析仪将AD9613采集的两个通道ADC数据250M数据显示出来。其中AD9613输出的是LVDS数据,通过select IO核转为并行数据。 一,搜索IP核:selectIO interface wizad ,并双击配置 配置为input,DDR模式,数据位宽为12bit,IO类型为差分,这里配置的是12对数据差分对。然后配置外部差分时钟。 将tap setting 设置为13,将时钟的边沿对准数据的中间,以免数据出错 二,

wangjie36的博客 4047

leetcode 1443. Minimum Time to Collect All Apples in a Tree 收集树上所有苹果的最少时间

Problem:使用了邻接表,深度优先搜索,求出从0到一个apple路径上所有的边的集合,最后边的个数*2就是答案。

邹九的个人博客 73

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Leetcode1443. Minimum Time to Collect All Apples in a Tree+dfs

【代码】Leetcode1443. Minimum Time to Collect All Apples in a Tree+dfs。

小堃哥的专栏 109

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode Hot 100 链表专题 三· 3 题(Java)

收录题目:2. 两数相加、19. 删除链表的倒数第 N 个结点、24. 两两交换链表中的节点。 统一结构:① 题目分析与解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结。 贯穿三题的两条主线:虚拟头结点 dummy(统一处理头结点被修改的场景)与 指针修改顺序(避免断链、丢引用)。

2401_88612756的博客 481

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 174

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 198

LeetCode 1861. 旋转盒子|Go 双指针解法

j >= 0,如果写成j>0,会漏掉第 0 列,最左侧石头处理失败旋转矩阵行列互换:原 m 行 n 列 → 结果 n 行 m 列,make 数组长度不要写反旋转公式m-1-i:是原总行数 m,不是 n!很容易写成n-1-i区分:本题和轮转数组(189)分组循环不一样!189:所有元素固定移动 k 步,需要 gcd 分组1861:障碍物分割成多个独立段,石头向段末尾挤,用双指针更合适。

2503_92676540的博客 175

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 195

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 166

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 198

LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)

【LetMeFly】453.最小操作次数使数组元素相等:两次遍历(反向思维)

<font color="Pink">Tisfy的博客</font> 202

【算法学习笔记】LeetCode 15:三数之和(排序 + 双指针)

使用sort()对数组进行排序。理解排序后双指针的移动原理。使用外层循环固定一个数字。使用左右指针寻找另外两个数字。使用continue和while实现去重。理解的执行逻辑。将三层循环优化为排序 + 双指针,使时间复杂度从 O(n³) 降低到 O(n²)。

aqiu111111的博客 156

LeetCode100 15. 三数之和

本题通过排序+双指针优化三数之和。先对数组排序,外层遍历固定第一个数,内层用左右指针查找另两个数,使三数之和为0。通过剪枝(当前数>0则终止)和去重(跳过重复元素)提升效率。相比暴力或哈希法,该方法时间复杂度为O(n²),空间O(1),更高效优雅。

Shaoxingzong的博客 321
上一篇: leetcode 1519. Number of Nodes in the Sub-Tree With the Same Label(子树中相同Label的节点个数)
下一篇: leetcode 2246. Longest Path With Different Adjacent Characters(不同相邻字母的最长路径)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值