LeetCode——690 员工的重要性(JAVA)
作者:互联网
给定一个保存员工信息的数据结构,它包含了员工 唯一的 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
。
思路
本题的结构是一个普通树,但是比较坑的一点是题目定义的Employee
结点,它的孩子是以id
形式存储的,如果是以List<Employee>
存储的话,在DFS中搜索孩子结点会方便很多。因为是以id
形式存储,并不能直接通过id
得到员工本人,所以我这里先用一个HashMap
遍历一遍输入的List<Employee> employees
集合,来建立一个id->员工
的映射,这样在DFS中搜索孩子结点时,只需要get(id)
即可。
然后就是DFS搜索要注意的地方:
因为题目不一定是从根结点开始搜索,所以要先找到所输入id
的那个员工,然后以它为根结点,遍历它的所有子树。至于重要度什么时候加,我认为在DFS结束之后加比较合适,否则如果在一个叶子结点就加一起,很容易会引起重复的相加。
另外,这里存储路径的path
在每次DFS退出的时候,不需要删除最后一个结点,这样的话,整个DFS结束之后,path
里存储的就是所有结点(包括根结点和它的所有子结点)。所以,在整个DFS结束之后,再遍历所有结点,将它们的重要度依次相加即可。
代码
public class Solution {
class Employee {//实际提交时可以不写类定义
//LeetCode自带
public int id;
public int importance;
public List<Integer> subordinates;
};
ArrayList<Employee> path = new ArrayList<Employee>();
HashMap<Integer, Employee> info = new HashMap<Integer, Employee>();//建立id->员工的映射
int sum = 0;
public void dfs(HashMap<Integer, Employee> info, Employee e) {
path.add(e);
if(e.subordinates.size()==0) {//如果没孩子
return;
}
else {
for(int i=0;i<e.subordinates.size();i++) {
Employee nextEmployee = new Employee();
nextEmployee = info.get(e.subordinates.get(i));
dfs(info, nextEmployee);
}
}
}
public int getImportance(List<Employee> employees, int id) {
Employee query = new Employee();
for(int i=0;i<employees.size();i++) {
info.put(employees.get(i).id, employees.get(i));
if(employees.get(i).id==id) query = employees.get(i);
}
dfs(info, query);
for(int i=0;i<path.size();i++) {
sum += path.get(i).importance;
}
return sum;
}
}
标签:结点,JAVA,get,int,690,员工,Employee,id,LeetCode 来源: https://blog.csdn.net/weixin_42257812/article/details/116330422