全社員への情報提供に要する時間

会社には  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;
    }
}

 

元の記事を710件公開 13のような 訪問数190,000以上

おすすめ

転載: blog.csdn.net/u013325815/article/details/105364165