leetcode競賽179場周競賽(3)------------通知所有員工所需的時間

公司裏有 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章