美文网首页
算法练习16:员工的重要性(leetcode 690)

算法练习16:员工的重要性(leetcode 690)

作者: miao8862 | 来源:发表于2021-05-01 23:01 被阅读0次

题目

给定一个保存员工信息的数据结构,它包含了员工 唯一的 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 。

员工的构造方法

// 员工节点
function Employee(id, importance, subordinates) {
  this.id = id;
  this.importance = importance;
  this.subordinates = subordinates;
}

// 根据数组创建employees对象
function createEmployees(arr) {
  let employees = []
  for(let i = 0; i < arr.length; i++) {
    employees.push(new Employee(arr[i][0], arr[i][1], arr[i][2]))
  }
  return employees
}
  • 考察点:
    我们可以看到员工的构造其实和树的节点差不多,所以我们比较容易想到的是树相关的内容。员工和下属之间关系就是父节点和子节点之间的关系,求员工的所有下属的某和,其实就是求这棵树的遍历和。树的遍历,大致有深度优先和广度优先两种。
    但无论是广度,还是深度优先遍历,都应该使用一个哈希表来存储当前员工的员工信息,避免重复计算。

深度优先算法

采用递归方式,先得出当前员工的权重,然后再分别对其子员工的权重相加,直到没有子员工为止

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
var GetImportance = function(employees, id) {
  let map = new Map()
  // 哈希表存放每个员工对应的员工关系表
  for(let i = 0; i < employees.length; i++) {
    map.set(employees[i].id, employees[i])
  }
  console.log(map)
  // 采用深度优先遍历
  function dfs(id) {
    let employee = map.get(id)
    let sum = employee.importance
    let subEm = employee.subordinates
    if(subEm.length) {
      for(let i = 0; i < subEm.length; i++) {
        sum += dfs(subEm[i])
      }
    }
    
    return sum;
  }
  return dfs(id)
};

广度优先算法

采用队列,初始权重totalIm为0,每次将当前员工id入队,就将队列的第一个员工出队,将出队员工的权重加上,并将其下属都入队,只要队列不为空,就继续这个循环,直到最后得出此员工的所有下属权重

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
var GetImportance = function(employees, id) {
  let map = new Map()
  // 哈希表存放每个员工对应的员工关系表
  for(let i = 0; i < employees.length; i++) {
    map.set(employees[i].id, employees[i])
  }
  let queue = []
  let totalIm = 0
  queue.push(id)
  while(queue.length) {
      let curId = queue.shift()
      let emp = map.get(curId)
      totalIm += emp.importance
      if(emp.subordinates.length) {
          queue = [...queue, ...emp.subordinates]
      }
  }
  return totalIm
};

let arr2 = createEmployees([[1,5,[2,3]],[2,3,[4]],[3,4,[]],[4,1,[]]])

let res = GetImportance(arr2, 1)
console.log(res) // 13

相关文章

网友评论

      本文标题:算法练习16:员工的重要性(leetcode 690)

      本文链接:https://www.haomeiwen.com/subject/epmzrltx.html