[路飞]_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 ,返回这个员工和他所有下属的重要度之和。
示例
输入:[[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
输出:11
解释:
员工 1 自身的重要度是 5 ,他有两个直系下属 2 和 3 ,而且 2 和 3 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11 。
提示
- 一个员工最多有一个 直系 领导,但是可以有多个 直系 下属
- 员工数量不超过 2000 。
题解
BFS
- 枚举员工数组,将员工数据保存在哈希表 mapmapmap 中
- mapmapmap 中 员工ididid作为keykeykey,员工重要性和员工下属作为 valuevaluevalue
- 创建搜索队列 listlistlist ,初始值为 startstartstart,从该员工开始广度优先搜索
- 从搜索队列 listlistlist随后一位取出员工 ididid,根据取到的 ididid 在哈希表 mapmapmap 中查询员工信息
- 对于每个遍历到的员工,将其重要性加到总和中,并查询该员工所有下属,将下属 ididid压入队列 listlistlist 中
- 直到搜索队列 listlistlist长度为0;结束搜索
- 返回结果
根据上述思路编辑代码如下:
var GetImportance = function (employees, id) {
const len = employees.length;
let map = {};
for (let i = 0; i < len; i++) {
const {id,importance,subordinates} = employees[i];
map[id] = [importance, subordinates];
}
let list = [id];
let result = 0;
while (list.length) {
const key = list.pop();
const [n, next] = map[key];
result += n;
list.push(...(next || []));
}
return result;
};
DFS
跟BFS一样,将员工数据保存在哈希表 mapmapmap 中。从入参id开始搜索当前员工的下属,如果有下属,在根据下属ID搜索下属员工的下属员工,直到员工没有下属员工,返回员工的上级。直到id所有下属员工搜索结束
var GetImportance = function (employees, id) {
const len = employees.length;
let map = {};
for (let i = 0; i < len; i++) {
const { id, importance, subordinates } = employees[i];
map[id] = [importance, subordinates];
}
let result = 0;
dfs(id);
return result;
function dfs(k) {
if (map[k] === undefined) return;
const [n, next] = map[k];
result += n;
for (let i = 0; i < next.length; i++) {
dfs(next[i]);
}
}
};
转载自:https://juejin.cn/post/7064554194249711630