入口

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/employee-importance/

题目描述

给定一个保存员工信息的数据结构,它包含了员工 唯一的 id 重要度 和 直系下属的 id 。比如,员工 1 是员工 2 的领导,员工 2 是员工 3 的领导。他们相应的重要度为 15 , 10 , 5 。那么员工 1 的数据结构是 [1, 15, [2]] ,员工 2的 数据结构是 [2, 10, [3]] ,员工 3 的数据结构是 [3, 5, []] 。注意虽然员工 3 也是员工 1 的一个下属,但是由于 并不是直系 下属,因此没有体现在员工 1 的数据结构中。

现在输入一个公司的所有员工信息,以及单个员工 id ,返回这个员工和他所有下属的重要度之和。

示例:

输入:[[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
输出:11
解释:
员工 1 自身的重要度是 5 ,他有两个直系下属 2 和 3 ,而且 2 和 3 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11 。

提示:

  • 一个员工最多有一个 直系 领导,但是可以有多个 直系 下属
  • 员工数量不超过 2000 。

  当遇到一个问题描述中涉及到多个个体之间存在层级关系,且这些关系可以看作是一个从顶层到底层的结构时,很可能你正在处理一个树结构问题。例如公司的组织结构、文件系统、家谱等等。

这道题就是一个典型的树结构问题。员工之间的领导和下属关系可以看作是一种层级结构,公司的管理层次就像是一棵树,顶级领导是树的根节点,而下属们是树的分支。要解决这个问题,需要通过遍历这棵树,累加每个员工的重要度,从而得到特定员工及其所有下属的重要度之和。

方法一:深度优先搜索

Java示例


class Solution {
Map<Integer, Employee> map = new HashMap<>(); // 创建一个映射,将员工ID映射到员工对象 public int getImportance(List<Employee> employees, int id) {
// 将员工列表中的员工对象放入映射表中,以便快速查找
for (Employee emp : employees) {
map.put(emp.id, emp);
}
// 调用深度优先搜索函数来计算员工及其下属员工的总重要性值
return dfs(id);
} public int dfs(int id) {
Employee emp = map.get(id); // 从映射表中获取指定ID对应的员工对象
int total = emp.importance; // 初始化总重要性值为员工的重要性值
List<Integer> subs = emp.subordinates; // 获取员工的下属员工ID列表
for (int i : subs) {
// 递归调用dfs函数来计算下属员工的总重要性值并累加到总值中
total += dfs(i);
}
// 返回累计的总重要性值
return total;
}
}

复杂度分析

时间复杂度:O(n),其中 n是员工数量。

空间复杂度:O(n),其中 n是员工数量。


方法二:广度优先搜索

Java示例

class Solution {
public int getImportance(List<Employee> employees, int id) {
// 创建一个映射,将员工的ID映射到对应的员工对象
Map<Integer, Employee> map = new HashMap<>(); int total = 0; // 用于累计重要度 // 将员工列表中的员工对象放入映射中
for (Employee employee : employees) {
map.put(employee.id, employee);
} // 创建一个队列,用于广度优先搜索
Queue<Integer> queue = new LinkedList<>();
queue.offer(id); // 将给定员工的ID加入队列,作为起始点 // 广度优先搜索
while (!queue.isEmpty()) {
int curId = queue.poll(); // 弹出队列中的当前员工ID
Employee emp = map.get(curId); // 获取当前员工对象 total += emp.importance; // 累加当前员工的重要度 List<Integer> subs = emp.subordinates; // 获取当前员工的下属ID列表 // 将当前员工的下属ID加入队列,以便后续遍历
for (int subId : subs) {
queue.offer(subId);
}
} return total; // 返回累计的总重要度
}
}

复杂度分析

时间复杂度:O(n),其中 n是员工数量。

空间复杂度:O(n),其中 n 是员工数量。哈希表的大小为 n,队列的大小不超过 n。

[每日算法 - 华为机试] leetcode690. 员工的重要性的更多相关文章

  1. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  2. 华为机试001:字符串最后一个单词的长度(华为OJ001)

    华为机试 字符串最后一个单词的长度 计算字符串最后一个单词的长度,单词以空格隔开. 提交网址: http://www.nowcoder.com/practice/8c949ea5f36f422594b ...

  3. 2014华为机试西安地区A组试题

    2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...

  4. 华为机试ACM(字符组合问题)

    今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...

  5. 华为机试正式版(西安c/c++/java),今天下午去机试的题目,新奇出炉了!

    下面题目都是回顾的.题目都非常easy, 大家有些基础就能够參加!(语言能够是c/c++.也能够是java的) 题目一(60分): 字符串操作. 将小写转换成大写, 将大写转化为小写, 数字的不做转换 ...

  6. 华为机试_字符串识别_Vector的使用;

    第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列.转换关系如下:描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu  ...

  7. 输入一个字符串,去掉重复的字符,并按ASCII值排序-华为机试

    import java.util.Scanner; //输入字符串,去掉重复的字符,并按ASSIC码值排序 public class quChong { public static void main ...

  8. 2015华为机试——数字基root

    题目描写叙述: 求整数的Root:给定正整数,求每位数字之和;假设和不是一位数,则反复; 输入:输入随意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行相 ...

  9. 华为机试 之 joseph环

    一:首先科普一下约瑟夫问题的数学方法 (1)  不管是用list实现还是用vector实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比較烦,并且时间复杂度高达O(nm),当n,m很大(比如上百 ...

  10. 华为机试-iNOC产品部-杨辉三角的变形

    题目描述 1 1 1 1 1 2 3 2 1 1 3 6 7 6 3 11 4 10 16 19 16 10 4 1以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数 ...

随机推荐

  1. (数据科学学习手札164)在vscode中调用Deepseek进行AI辅助编程

    本文示例配置文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,最近国产大模型Deepse ...

  2. 基于wvp-GB28181-pro 与 ZLMediaKit 的国标服务器

    官方教程 wvp-GB28181-pro 与 ZLMediaKit 的联调手册 wvp-GB28181-pro wiki ZLMediaKit 基于C++11的高性能运营级流媒体服务框架 地址:Git ...

  3. weixueyuan-Nginx核心配置指令2

    https://www.weixueyuan.net/nginx/config/ Nginx配置文件详解 Nginx 默认编译安装后,配置文件都会保存在 /usr/local/nginx/conf 目 ...

  4. biancheng-Java设计模式:23种设计模式全面解析(超级详细)

    http://c.biancheng.net/design_pattern/ 24种设计模式 1.创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创 ...

  5. cmake-4

    cmake-4学习,参考 cmake构建c++项目快速入门2-1 cmake构建c++项目快速入门2-2 了解 cmake的工作原理: Windows下用cmake编译cmake (1)先下载cmak ...

  6. java重载-构造方法也存在重载-数据类型的提升

    重载 1.一个类中不能声明多个相同的方法,属性. 2.上面的相同指的是方法名,参数列表相同.和返回值类型无关. 3.如果方法名相同,但是参数列表(个数,顺序,类型)不相同,会认为是不同的方法,在jav ...

  7. 闲话 6.30 -JL 引理

    参考了 https://spaces.ac.cn/archives/8679/comment-page-1,有一些增删. JL 引理 首先下面需要应用马尔可夫不等式的另一个形式: \[\newcomm ...

  8. 概率学习(Genshin中)

    目前待补充:停时定理的部分例题. 定义 首先定义样本空间 \(\Omega\),是所有样本点(结果)的集合. 随机事件 \(A\) 是样本空间的子集. 定义事件和为事件并,积为事件交. 事件域 \(\ ...

  9. Paxos算法:如何解决分布式系统中的共识问题?

    背景 Paxos 算法是 Leslie Lamport(莱斯利·兰伯特)在 1990 年提出了一种分布式系统 共识 算法.这也是第一个被证明完备的共识算法(前提是不存在拜占庭将军问题,也就是没有恶意节 ...

  10. Vulnhub-kioptix2014靶机getshell及提权

    靶机搭建 点击扫描虚拟机 然后扫描文件夹即可 信息收集 扫描ip nmap扫描得到目标靶机ip nmap -sn 192.168.108.0/24 故 攻击机:192.168.108.130 目标靶机 ...