1376.通知所有员工所需的时间
难度: 中等
标签: Python Java dfs tree
题目描述
公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。
在 manager 数组中,每个员工都有一个直属负责人,其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人,manager[headID] = -1。
题目保证从属关系可以用树结构显示。
公司总负责人想要向公司所有员工通告一条紧急消息。他将会首先通知他的直属下属们,然后由这些下属通知他们的下属,直到所有的员工都得知这条紧急消息。
第 i 名员工需要 informTime[i] 分钟来通知它的所有直属下属(也就是说在 informTime[i] 分钟后,他的所有直属下属都可以开始传播这一消息)。
返回通知所有员工这一紧急消息所需要的 分钟数 。
提示:
- 1 <= n <= 10^5
- 0 <= headID < n
- manager.length == n
- 0 <= manager[i] < n
- manager[headID] == -1
- informTime.length == n
- 0 <= informTime[i] <= 1000
- 如果员工 i 没有下属,informTime[i] == 0 。
- 题目 保证 所有员工都可以收到通知。
示例说明
示例 1:
输入:n = 1, headID = 0, manager = [-1], informTime = [0]
输出:0
解释:公司总负责人是该公司的唯一一名员工。
示例 2:
输入:n = 6, headID = 2, manager = [2,2,-1,2,2,2], informTime = [0,0,1,0,0,0]
输出:1
解释:id = 2 的员工是公司的总负责人,也是其他所有员工的直属负责人,他需要 1 分钟来通知所有员工。
思路分析
根据题目描述 ”题目保证从属关系可以用树结构显示”
我们可以初始化一个字典,然后将manager数组内的依赖关系,保存到字典中。
这里要注意的是,最长的时间是从根节点开始到每一个叶子节点所花费时间的最大值。
既然要获取每个节点,可以采取深度优先搜索的方式来完成。
由于根节点的val值为-1,我们就可以初始化dfs方法,def(节点-1,用时0)。
当某一个K在字典中找不到时,标识它已经处于叶子节点。此时比较总耗时大小即可。
Python代码
from collections import defaultdict
class Solution:
def numOfMinutes(self, n, headID, manager, informTime):
def dfs(idx, cnt):
if idx not in d:
nonlocal ret
ret = max(ret, cnt)
return
for k in d[idx]:
dfs(k, cnt + informTime[k])
d, ret = defaultdict(list), 0
for i in range(len(manager)):
d[manager[i]].append(i)
dfs(-1, 0)
return ret
Java代码
class Solution {
int ret = 0;
HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
for (int i = 0; i < manager.length; i++) {
ArrayList<Integer> val = map.getOrDefault(manager[i], new ArrayList<>());
val.add(i);
map.put(manager[i], val);
}
dfs(-1, 0, informTime);
return ret;
}
public void dfs(int idx, int time, int[] informTime) {
if (!this.map.containsKey(idx)) {
this.ret = Math.max(this.ret, time);
} else {
for (int k : this.map.get(idx)) {
dfs(k, time + informTime[k], informTime);
}
}
}
}
欢迎关注GZH: 算法直通车,直击大厂算法面试真题,带你轻松上岸,斩获offer!
关注 GZH 后台回复 书籍,可获取整理好的相关算法书籍。
个人微信号: codingtrains,添加请备注来意,eg:来自力扣/牛客、刷题讨论、面试咨询。