美文网首页算法
1376. 通知所有员工所需的时间

1376. 通知所有员工所需的时间

作者: 红树_ | 来源:发表于2023-04-30 19:56 被阅读0次

    五一劳动节快乐! 国际劳动节又称“五一国际劳动节”(英语:International Workers' Day,May Day),是世界上80多个国家的全国性节日。定在每年的五月一日。它是全世界劳动人民共同拥有的节日。

    LC每日一题,参考1376. 通知所有员工所需的时间

    题目

    1. 公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0n - 1。公司的总负责人通过 headID 进行标识。
    2. 在 manager 数组中,每个员工都有一个直属负责人,其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人,manager[headID] = -1。题目保证从属关系可以用树结构显示。
    3. 公司总负责人想要向公司所有员工通告一条紧急消息。他将会首先通知他的直属下属们,然后由这些下属通知他们的下属,直到所有的员工都得知这条紧急消息。
    4. 第 i 名员工需要 informTime[i] 分钟来通知它的所有直属下属(也就是说在 informTime[i] 分钟后,他的所有直属下属都可以开始传播这一消息)。

    返回通知所有员工这一紧急消息所需要的 分钟数

    解题思路

    • 记忆化搜索:可直接递归求每一位员工叶子节点通知所需时间取最大值即可,递归时可使用记忆化搜索防止重复计算。

    记忆化搜索

    class Solution {
    
         int[] manager, informTime, memo;
         int n,headID;
        public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
            //考虑递归求树的最长直径
            this.manager = manager;
            this.informTime = informTime;
            this.n = n;
            this.headID = headID;
            int max = 0;
            //记忆化搜索优化
            memo = new int[n];
            for(int i = 0; i < n; i++) {
                max = Math.max(max,dfs(i));
            }
            return max;
        }
    
        //总负责人到i员工通知时间
        int dfs(int id) {
            if(memo[id] > 0) return memo[id];
            if(id == headID) return 0;
            if(manager[id] == headID) return memo[id] = informTime[headID];
            return memo[id] = informTime[manager[id]] +dfs(manager[id]);//上级通知时间+上级的上级通知时间
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n),递归时记忆的状态个数n,n为员工数。
    • 空间复杂度:O(n),记忆辅助数组空间n

    2023.05.01

    相关文章

      网友评论

        本文标题:1376. 通知所有员工所需的时间

        本文链接:https://www.haomeiwen.com/subject/lminjdtx.html