690. 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:
输入: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1 输出: 11 解释: 员工1自身的重要度是5,他有两个直系下属2和3,而且2和3的重要度均为3。因此员工1的总重要度是 5 + 3 + 3 = 11。
注意:
- 一个员工最多有一个直系领导,但是可以有多个直系下属
- 员工数量不超过2000。
- 题目难度:简单。
- 英文网址:690. Employee Importance 。
- 中文网址:690. 员工的重要性 。
思路分析
求解关键:这是一道典型的图算法的基本问题,从起点开始遍历,遍历到没有下属结点的结点就可以了。
两种遍历的方法都可以使用 + 使用深度优先遍历,隐式地调用栈。 + 使用广度优先遍历,显示地使用队列。
参考解答
参考解答1:DFS。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
class Employee {
// It's the unique id of each node;
// unique id of this employee
public int id;
// the importance value of this employee
public int importance;
// the id of direct subordinates
public List<Integer> subordinates;
};
public class Solution {
private int sum = 0;
private Set<Integer> visited;
private Map<Integer, Employee> map;
// 深度优先遍历
public int getImportance(List<Employee> employees, int id) {
map = new HashMap<>();
for (Employee employee : employees) {
map.put(employee.id, employee);
}
visited = new HashSet<>();
dfs(map.get(id));
return this.sum;
}
private void dfs(Employee employee) {
if (!visited.contains(employee.id)) {
visited.add(employee.id);
this.sum += employee.importance;
for (Integer id : employee.subordinates) {
dfs(map.get(id));
}
}
}
public static void main(String[] args) {
Employee employee1 = new Employee();
employee1.id = 1;
employee1.importance = 5;
List<Integer> subordinates1 = new ArrayList<>();
subordinates1.add(2);
subordinates1.add(3);
employee1.subordinates = subordinates1;
Employee employee2 = new Employee();
employee2.id = 2;
employee2.importance = 3;
employee2.subordinates = new ArrayList<>();
Employee employee3 = new Employee();
employee3.id = 3;
employee3.importance = 3;
employee3.subordinates = new ArrayList<>();
List<Employee> employees = new ArrayList<>();
employees.add(employee1);
employees.add(employee2);
employees.add(employee3);
Solution solution = new Solution();
int importance = solution.getImportance(employees, 1);
System.out.println(importance);
}
}
参考解答2:BFS。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Solution2 {
public int getImportance(List<Employee> employees, int id) {
Map<Integer, Employee> map = new HashMap<>();
for (Employee employee : employees) {
map.put(employee.id, employee);
}
Set<Integer> visited = new HashSet<>();
LinkedList<Integer> queue = new LinkedList<>();
int res = 0;
queue.addLast(id);
while (!queue.isEmpty()) {
Integer curId = queue.removeFirst();
if (!visited.contains(curId)) {
Employee curEmp = map.get(curId);
res += curEmp.importance;
for (Integer eid : curEmp.subordinates) {
queue.addLast(eid);
}
}
}
return res;
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0690-employee-importance ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。