五一劳动节快乐! 国际劳动节又称“五一国际劳动节”(英语:International Workers' Day,May Day),是世界上80多个国家的全国性节日。定在每年的五月一日。它是全世界劳动人民共同拥有的节日。
LC每日一题,参考1376. 通知所有员工所需的时间。
题目
1. 公司里有 n
名员工,每个员工的 ID
都是独一无二的,编号从 0
到 n - 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
网友评论