力扣 690. 员工的重要性

题目说明

  • 给定一个保存员工信息的数据结构,它包含了员工 唯一的 id重要度直系下属的 id

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

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

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

示例

例1

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

笔者理解

此题是一道哈希算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题需要注意的是,员工编号并不一定是按照顺序来排列的,所以需要借助哈希表或者其他数据结构进行存储求解,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
// Definition for Employee.
class Employee {
public int id;
public int importance;
public List<Integer> subordinates;
};
*/

class Solution {
int result = 0;
HashMap<Integer, Employee> map = new HashMap();

public int getImportance(List<Employee> employees, int id) {
int n = employees.size();

for (int i = 0; i < n; i++) {
// 将员工编号和员工存进哈希表
map.put(employees.get(i).id, employees.get(i));
}

// 递归将重要性累加
count(id);
return result;
}

public void count(int id) {
result += map.get(id).importance;

if (map.get(id).subordinates == null) {
return ;
}

for (int i = 0;i < map.get(id).subordinates.size(); i++) {
count(map.get(id).subordinates.get(i));
}
}
}

时间和空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。