前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)

LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)

作者头像
Michael阿明
发布于 2020-07-13 06:23:34
发布于 2020-07-13 06:23:34
50400
代码可运行
举报
运行总次数:0
代码可运行

1. 题目

给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。 通过树上的一条边,需要花费 1 秒钟。 你从 节点 0 出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点 0 。

无向树的边由 edges 给出,其中 edges[i] = [fromi, toi] ,表示有一条边连接 from 和 toi 。 除此以外,还有一个布尔数组 hasApple ,其中 hasApple[i] = true 代表节点 i 有一个苹果,否则,节点 i 没有苹果。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], 
hasApple = [false,false,true,false,true,true,false]
输出:8 
解释:上图展示了给定的树,其中红色节点表示有苹果。
一个能收集到所有苹果的最优方案由绿色箭头表示。

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], 
hasApple = [false,false,true,false,false,true,false]
输出:6
解释:上图展示了给定的树,其中红色节点表示有苹果。
一个能收集到所有苹果的最优方案由绿色箭头表示。

示例 3:
输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], 
hasApple = [false,false,false,false,false,false,false]
输出:0
 
提示:
1 <= n <= 10^5
edges.length == n-1
edges[i].length == 2
0 <= fromi, toi <= n-1
fromi < toi
hasApple.length == n

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-time-to-collect-all-apples-in-a-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 由题目条件可知向上走的路径只有1个分支,把反向的路径存在哈希map里
  • 遍历hasApple数组,对有苹果的序号,进行dfs往上找,找到一条边,就在哈希表里删除一条
  • 最后返回边的个数乘以2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {
		unordered_map<int,int> up;//向上走的路径
    	for(vector<int> & e : edges)
    		up[e[1]] = e[0];
    	
    	int s = 0;
    	for(int i = 0; i < hasApple.size(); ++i)
    	{
    		if(hasApple[i])
    		    dfs(i, up, s);
    	}
    	return 2*s;
    }
    void dfs(int i, unordered_map<int,int>& up, int& s)
    {
    	if(up.count(i))
    	{
    		s++;
    		int to = up[i];//上层节点
    		up.erase(i);//删除边
    		dfs(to,up,s);
    	}
    }
};

360 ms 56.3 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 第 198 场周赛(434/5778,前7.51%)
第二题图的边给的不一定按顺序的,我按有序的做,错误一次,第三题好难跳过了,第四题暴力超时,贪心不对。继续加油!
Michael阿明
2021/02/19
3400
LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)
全国排名: 511 / 3304,15.5%;全球排名: 1626 / 11366,14.3%
Michael阿明
2021/02/19
3300
2025-03-21:统计好节点的数目。用go语言,给定一棵无向树,树中有 n 个节点,节点的标号从 0 到 n - 1,根节点
2025-03-21:统计好节点的数目。用go语言,给定一棵无向树,树中有 n 个节点,节点的标号从 0 到 n - 1,根节点为 0。我们有一个长度为 n - 1 的二维数组 edges,其中 edges[i] = [ai, bi] 表示节点 ai 和节点 bi 之间有一条边。
福大大架构师每日一题
2025/03/21
770
2025-03-21:统计好节点的数目。用go语言,给定一棵无向树,树中有 n 个节点,节点的标号从 0 到 n - 1,根节点
LeetCode 第 197 场周赛(468/5273,前8.88%)
第三题一个地方的数组长度写错,浪费了好多时间,成绩应该可以再往前靠一下的,第四题数学最优化问题,不会。这是目前最好成绩 8.88%,继续加油!
Michael阿明
2021/02/19
3420
LeetCode 1466. 重新规划路线(DFS/BFS)
n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。 去年,交通运输部决定重新规划路线,以改变交通拥堵的状况。
Michael阿明
2020/07/13
8910
LeetCode 1466. 重新规划路线(DFS/BFS)
LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。 线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。
Michael阿明
2020/07/13
6070
LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)
组内刷题之LeetCode第188周赛解题思路
题目:给你一个目标数组 target 和一个整数 n。每次迭代,需要从 list = {1,2,3..., n} 中依序读取一个数字。
公众号guangcity
2020/06/09
5190
LeetCode 5300. 有向无环图中一个节点的所有祖先(拓扑排序)
给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。
Michael阿明
2022/03/10
8930
LeetCode 5300. 有向无环图中一个节点的所有祖先(拓扑排序)
Leetcode | 第7节:DFS,BFS
这一节我们介绍一下DFS和BFS,也就是深度优先搜索和广度优先搜索。搜索算法也是很多题目我们所会考虑的第一个算法,因为想法直接而易想。本来是要介绍树有关的内容的,但是研究了一下材料发现,其实树相关的题目还是挺多需要用到我们这一节说到的搜索算法的,所以我们就临时换了一下介绍顺序。
学弱猹
2021/08/10
6550
Leetcode | 第7节:DFS,BFS
LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)
给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。
Michael阿明
2021/02/19
9900
LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)
LeetCode 1377. T 秒后青蛙的位置(BFS)
给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下:
Michael阿明
2020/07/13
5340
LeetCode 2065. 最大化一张图中的路径价值(DFS)
给你一张 无向 图,图中有 n 个节点,节点编号从 0 到 n - 1 (都包括)。 同时给你一个下标从 0 开始的整数数组 values ,其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开始的二维整数数组 edges ,其中 edges[j] = [uj, vj, timej] 表示节点 uj 和 vj 之间有一条需要 timej 秒才能通过的无向边。最后,给你一个整数 maxTime 。
Michael阿明
2022/01/07
4310
LeetCode 2065. 最大化一张图中的路径价值(DFS)
LeetCode 1334. 阈值距离内邻居最少的城市(最短路径Dijkstra)
有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。
Michael阿明
2020/07/13
1K0
LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
给定一组 N 人(编号为 1, 2, …, N), 我们想把每个人分进任意大小的两组。
Michael阿明
2020/07/13
3790
LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
LeetCode周赛194总结
这次来参加了一下194周赛,做完前两道,后面第三道思路不太对,写错了,就差了一个函数调用。。最后一道是一个prim/kruskal算法求解最小生成树的问题,这两个算法之前也没实现过,于是就不太会做了,下来总结一下这次的题解,互相学习吧,期待下次周赛的进步。
公众号guangcity
2020/06/24
4080
LeetCode 1059. 从始点到终点的所有路径(回溯)
给定有向图的边 edges,以及该图的始点 source 和目标终点 destination,确定从始点 source 出发的所有路径是否最终结束于目标终点 destination,即:
Michael阿明
2021/02/19
1.2K0
LeetCode 834. 树中距离之和(树上DP)*
给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边 。
Michael阿明
2021/02/19
5760
​LeetCode刷题实战261:以图判树
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/05/28
4450
​LeetCode刷题实战261:以图判树
LeetCode 261. 以图判树(全部连通+边数=V-1)
给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示), 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。
Michael阿明
2020/07/13
1.5K0
【树形 DP】如何从"方向"角度理解树形 DP
返回长度为 n 的数组 answer,其中 answer[i] 是树中第 i 个节点与所有其他节点之间的距离之和。
宫水三叶的刷题日记
2023/09/22
3510
【树形 DP】如何从"方向"角度理解树形 DP
推荐阅读
相关推荐
LeetCode 第 198 场周赛(434/5778,前7.51%)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档