公司裏有 n 名員工,每個員工的 ID 都是獨一無二的,編號從 0 到 n - 1。公司的總負責人通過 headID 進行標識。
在 manager 數組中,每個員工都有一個直屬負責人,其中 manager[i] 是第 i 名員工的直屬負責人。對於總負責人,manager[headID] = -1。題目保證從屬關係可以用樹結構顯示。
公司總負責人想要向公司所有員工通告一條緊急消息。他將會首先通知他的直屬下屬們,然後由這些下屬通知他們的下屬,直到所有的員工都得知這條緊急消息。
第 i 名員工需要 informTime[i] 分鐘來通知它的所有直屬下屬(也就是說在 informTime[i] 分鐘後,他的所有直屬下屬都可以開始傳播這一消息)。
返回通知所有員工這一緊急消息所需要的 分鐘數 。
示例 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 分鐘來通知所有員工。
上圖顯示了公司員工的樹結構。
示例 3:
輸入:n = 7, headID = 6, manager = [1,2,3,4,5,6,-1], informTime = [0,6,5,4,3,2,1]
輸出:21
解釋:總負責人 id = 6。他將在 1 分鐘內通知 id = 5 的員工。
id = 5 的員工將在 2 分鐘內通知 id = 4 的員工。
id = 4 的員工將在 3 分鐘內通知 id = 3 的員工。
id = 3 的員工將在 4 分鐘內通知 id = 2 的員工。
id = 2 的員工將在 5 分鐘內通知 id = 1 的員工。
id = 1 的員工將在 6 分鐘內通知 id = 0 的員工。
所需時間 = 1 + 2 + 3 + 4 + 5 + 6 = 21 。
示例 4:
輸入:n = 15, headID = 0, manager = [-1,0,0,1,1,2,2,3,3,4,4,5,5,6,6], informTime = [1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]
輸出:3
解釋:第一分鐘總負責人通知員工 1 和 2 。
第二分鐘他們將會通知員工 3, 4, 5 和 6 。
第三分鐘他們將會通知剩下的員工。
示例 5:
輸入:n = 4, headID = 2, manager = [3,3,-1,2], informTime = [0,0,162,914]
輸出:1076
提示:
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 。
題目 保證 所有員工都可以收到通知。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/time-needed-to-inform-all-employees
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
我的代碼:
from collections import defaultdict
class Solution:
def numOfMinutes(self, n: int, headID: int, manager: List[int], informTime: List[int]) -> int:
tree = defaultdict(set)
for i, e in enumerate(manager):
if e == -1:
root = i
else:
tree[e].add(i)
total = 0
q = [(root, informTime[root])]
while q:
n_q = []
while q:
n, t = q.pop()
for child in tree[n]:
if t + informTime[child] > total:
total = t + informTime[child]
n_q.append((child, t + informTime[child]))
q = n_q
return total