likes
comments
collection
share

[路飞]_690.员工的重要性

作者站长头像
站长
· 阅读数 24

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
评论
请登录