【每日一题Day193】LC1376通知所有员工所需的时间 | dfs

news/2024/7/20 20:14:44 标签: 深度优先, 算法, leetcode

通知所有员工所需的时间【LC1376】

公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0n - 1。公司的总负责人通过 headID 进行标识。

manager 数组中,每个员工都有一个直属负责人,其中 manager[i] 是第 i 名员工的直属负责人。对于总负责人,manager[headID] = -1。题目保证从属关系可以用树结构显示。

公司总负责人想要向公司所有员工通告一条紧急消息。他将会首先通知他的直属下属们,然后由这些下属通知他们的下属,直到所有的员工都得知这条紧急消息。

i 名员工需要 informTime[i] 分钟来通知它的所有直属下属(也就是说在 informTime[i] 分钟后,他的所有直属下属都可以开始传播这一消息)。

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

写出了方法一

自顶向下

  • 思路

    当总负责人发送完通知后,直属下属们可以同时向他们的下属发送通知,因此通知所有员工所需要的时间为直属下属通知其下面的员工的最大时间,因此可以使用dfs实现

  • 实现

    • 首先通过矩阵存储每位领导的下属
    • 然后使用dfs搜索,dfs(p)的含义为通知ID为p的负责人下面的所有员工所需要的时间,因此dfs(headID)即为结果
    class Solution {
        List<Integer>[] list;
        int[] informTime;
        public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
            list = new List[n];
            Arrays.setAll(list, e -> new ArrayList<>());
            int res = 0;
            this.informTime = informTime;
            for (int i = 0; i < n; i++){
                if (manager[i] != -1){
                    list[manager[i]].add(i);
                }
            }
            return dfs(headID);
        }
        public int dfs(int p){
            if (list[p].size() == 0) return 0;
            int res = 0;
            for (int u : list[p]){
                res = Math.max(res, dfs(u));
            }
            return res + informTime[p];
        }
    }
    
    • 复杂度

      • 时间复杂度: O ( n ) O(n) O(n)
      • 空间复杂度: O ( n ) O(n) O(n)

自底向上

  • 思路:

    不建树,顺着父节点,向上搜索,同时累加路径上的通知时间

  • 实现:dfs+记忆化

    class Solution {
        public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
            var memo = new int[n];
            Arrays.fill(memo, -1); // -1 表示还没有计算过
            int ans = 0;
            for (int i = 0; i < n; i++)
                ans = Math.max(ans, dfs(manager, informTime, memo, i));
            return ans;
        }
    
        private int dfs(int[] manager, int[] informTime, int[] memo, int x) {
            if (manager[x] < 0) return informTime[x];
            if (memo[x] >= 0) return memo[x]; // 之前计算过了
            return memo[x] = dfs(manager, informTime, memo, manager[x]) + informTime[x];
        }
    }
    
    作者:灵茶山艾府
    链接:https://leetcode.cn/problems/time-needed-to-inform-all-employees/solutions/2251986/shen-ru-li-jie-di-gui-zi-ding-xiang-xia-ps0mm/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 优化:标记为-1

    class Solution {
        public int numOfMinutes(int n, int headID, int[] manager, int[] informTime) {
            int ans = 0;
            for (int i = 0; i < n; i++)
                ans = Math.max(ans, dfs(manager, informTime, i));
            return ans;
        }
    
        private int dfs(int[] manager, int[] informTime, int x) {
            if (manager[x] >= 0) {
                informTime[x] += dfs(manager, informTime, manager[x]);
                manager[x] = -1; // 标记 x 计算过
            }
            return informTime[x];
        }
    }
    
    作者:灵茶山艾府
    链接:https://leetcode.cn/problems/time-needed-to-inform-all-employees/solutions/2251986/shen-ru-li-jie-di-gui-zi-ding-xiang-xia-ps0mm/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

http://www.niftyadmin.cn/n/280500.html

相关文章

新老stp的配置和安全总结部分

老stp只有根桥没有备份桥 老stp的五种接口状态&#xff1a; disable 接口down没开stp blocking 阻塞 listening 发bpdu&#xff0c;比较bpdu优劣 leraning 开始学习mac地址表 forwardding 转发 老stp直接拓扑变化30秒&#xff0c;间接拓扑变化50秒 RSTP只有3种端口状态&#…

C语言-学习之路-02

C语言学习之路-02 目录运算符与表达式常用运算符分类算术运算符赋值运算符比较运算符逻辑运算符类型转换 目录 运算符与表达式 常用运算符分类 运算符类型作用算术运算符用于处理四则运算。赋值运算符用于将表达式的值赋给变量。比较运算符用于表达式的比较&#xff0c;并返…

typescript Awaited<Type>教程用法

typescript Awaited教程用法 文章目录 typescript Awaited<Type>教程用法 ts4.5发布了Awaited&#xff0c;但是很多人不明白Awaited的用法。 首先看一下官方的说明&#xff1a;这种类型旨在模拟函数await中的操作async&#xff0c;或 s.then()上的方法——特别是它们递归…

SwiftUI 设计和调试复杂界面的基本技巧示例

功能需求 对于比较复杂的 SwiftUI 界面,我们需要在充分了解 SwiftUI 各个视图基本特性的同时,合理利用 Xcode 强大的预览(Preview)机制,实时且全面的测试所有场景下的显示情况。 如上图所示:我们在 App 支持的每种语言环境中都对界面进行了全面的测试,并解决了 Cell 里…

3 文件和目录

3.1 stat、fstat、lstat 函数 #include <sys/types.h> #include <sys/stat.h>//三个函数的返回&#xff1a;若成功则为 0&#xff0c;若出错则为-1 int stat(const char *pathname, struct stat *buf) ; int fstat(int filedes,struct stat * buf) ; int lstat(co…

【C++】string类常用接口

目录 一、string类二、string类的常用接口1.string类对象的常见构造2.string类对象的容量操作3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类非成员函数6.vs和g下string结构的说明 一、string类 STL的六大组件&#xff1a; 字符串是表示字符序列的类标准…

JavaEE初阶 - 文件/IO

一、认识文件 我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存成一个整体&#xff0c;而是独立成一个个的单位进行保存&#xff0c;这个独立的单位就被抽象成文件的概念&#xff0c;就类似办公…

JavaWeb——HTML和CSS

HTML和CSS定义 标记语言 :比如XML:可扩展的标记语言&#xff0c;标签可以自己定义&#xff0c;解析时需要按照定义的规则去解析。 学习目的:掌握常见标签和常见样式的使用 HTML 结构: 特点: 1.不区分大小写&#xff0c;不管是<html>还是<HTML>都是一样的作用 …