会社には n
、から0
までの各従業員に一意のIDを持つ従業員が い n - 1
ます。会社の責任者はの責任者です headID
。
各従業員には、manager
配列で 指定された1人の直属の上司 manager[i]
がいます。は、i-th
従業員の 直属の上司です manager[headID] = -1
。また、従属関係がツリー構造を持つことが保証されています。
会社の責任者は、会社のすべての従業員に緊急のニュースを知らせたいと考えています。彼は直属の部下に通知し、すべての従業員が緊急のニュースを知るまで、部下に通知します。
i-th
従業員が必要とする informTime[i]
(すなわちinformTime [i]の分後、彼のすべての直接の部下がニュースを広げ始めることができます)彼の直接の部下のすべてを知らせるために数分を。
すべての従業員に緊急のニュースを通知するのに必要な分数を返し ます。
例1:
入力: n = 1、headID = 0、manager = [-1]、informTime = [0] 出力: 0 説明:会社の頭は会社の唯一の従業員です。
例2:
入力: n = 6、headID = 2、マネージャー= [2,2、-1,2,2,2]、informTime = [0,0,1,0,0,0] 出力: 1 説明:のヘッドid = 2の会社は、会社の全従業員の直属の上司であり、全員に通知するのに1分必要です。 会社の従業員のツリー構造が表示されます。
アイデア:それがツリーの場合、最大時間、ノード+自分の時間+弟の最大値に戻り、上方に戻ることです。
問題は、グラフの作成方法です。賢い問題は、マネージャーがキーであり、値が従業員リストであるということです
T:O(N)、S:O(N)
class Solution {
public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
HashMap<Integer, List<Integer>> graph = new HashMap<>();
int ceo = 0;
for(int i = 0; i < manager.length; i++) {
if(manager[i] == -1) {
ceo = i;
}
graph.putIfAbsent(manager[i], new ArrayList<Integer>());
graph.get(manager[i]).add(i);
}
return dfs(ceo, graph, informTime);
}
private int dfs(int start, HashMap<Integer, List<Integer>> graph, int[] informTime) {
if(!graph.containsKey(start)) {
return 0;
}
int sum = informTime[start];
int levelmax = 0;
for(Integer neighbor: graph.get(start)) {
levelmax = Math.max(levelmax, dfs(neighbor, graph, informTime));
}
sum += levelmax;
return sum;
}
}