[LeetCode] Employee Importance 员工重要度

简介:

You are given a data structure of employee information, which includes the employee's unique id, his importance value and his direct subordinates' id.

For example, employee 1 is the leader of employee 2, and employee 2 is the leader of employee 3. They have importance value 15, 10 and 5, respectively. Then employee 1 has a data structure like [1, 15, [2]], and employee 2 has [2, 10, [3]], and employee 3 has [3, 5, []]. Note that although employee 3 is also a subordinate of employee 1, the relationship is not direct.

Now given the employee information of a company, and an employee id, you need to return the total importance value of this employee and all his subordinates.

Example 1:

Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
Output: 11
Explanation:
Employee 1 has importance value 5, and he has two direct subordinates: employee 2 and employee 3. They both have importance value 3. So the total importance value of employee 1 is 5 + 3 + 3 = 11.

Note:

    1. One employee has at most one direct leader and may have several subordinates.
    2. The maximum number of employees won't exceed 2000.

这道题定义了一种员工类,有id,重要度,和direct report的员工,让我们求某个员工的总重要度。我们要明白的是就算某个员工不直接向你汇报工作,而是向你手下人汇报,这个人的重要度也会算进你的重要度中。这其实就是之前那道Nested List Weight Sum的变化形式,我们可以用DFS来做。首先我们想,为了快速的通过id来定位到员工类,需要建立一个id和员工类的映射,然后我们根据给定的员工id来算其重要度。计算方法当然是其本身的重要度加上其所有手下人的重要度,对于手下人,还要累加其手下人的重要度,为了不重复计算某个员工的重要度,我们建立一个集合,将遍历过的员工id放到集合中,这样一旦我们遍历到集合中有的员工,直接返回0即可;否则就将该员工id加入集合中,然后建立一个结果res变量,加上当前员工的重要度,然后遍历其所有手下,对其每个手下人调用递归函数加到res上,最后返回res即可,参见代码如下:

解法一:

public:
    int getImportance(vector<Employee*> employees, int id) {
        unordered_set<int> s;
        unordered_map<int, Employee*> m;
        for (auto e : employees) m[e->id] = e;
        return helper(id, m, s);
    }
    int helper(int id, unordered_map<int, Employee*>& m, unordered_set<int>& s) {
        if (s.count(id)) return 0;
        s.insert(id);
        int res = m[id]->importance;
        for (int num : m[id]->subordinates) {
            res += helper(num, m, s);
        }
        return res;
    }
};

我们也可以用BFS来做,使用一个queue来辅助运算,开始将给定员工id放入,然后当queue不为空进行循环,每次取出队首员工,如果已经访问过了,直接跳过,否则加入集合中,然后累加上当前员工的复杂度到结果res,然后将其所有手下人加入队列等待遍历,参见代码如下:

解法二:

public:
    int getImportance(vector<Employee*> employees, int id) {
        int res = 0;
        queue<int> q{{id}};
        unordered_set<int> s;
        unordered_map<int, Employee*> m;
        for (auto e : employees) m[e->id] = e;
        while (!q.empty()) {
            auto t = q.front(); q.pop();
            if (s.count(t)) continue;
            s.insert(t);
            res += m[t]->importance;
            for (int num : m[t]->subordinates) {
                q.push(num);
            }
        }
        return res;
    }
}; 

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Employee Importance 员工重要度

,如需转载请自行联系原博主。

相关文章
|
4月前
|
SQL 算法 vr&ar
☆打卡算法☆LeetCode 181. 超过经理收入的员工 算法解析
☆打卡算法☆LeetCode 181. 超过经理收入的员工 算法解析
|
11月前
【leetcode】690.员工的重要性
【leetcode】690.员工的重要性
37 0
【LeetCode】员工的重要性 | 图像渲染 | 岛屿问题
【LeetCode】员工的重要性 | 图像渲染 | 岛屿问题
【LeetCode】员工的重要性 | 图像渲染 | 岛屿问题
|
数据库
LeetCode(数据库)- 员工的直属部门
LeetCode(数据库)- 员工的直属部门
85 0
|
数据库
LeetCode(数据库)- 查找每个员工花费的总时间
LeetCode(数据库)- 查找每个员工花费的总时间
90 0
|
数据库
LeetCode(数据库)- 每位经理的下属员工数量
LeetCode(数据库)- 每位经理的下属员工数量
68 0
|
数据库
LeetCode(数据库)- 使用唯一标识码替换员工ID
LeetCode(数据库)- 使用唯一标识码替换员工ID
101 0
|
数据库
LeetCode(数据库)- 项目员工 III
LeetCode(数据库)- 项目员工 III
64 0
|
数据库
LeetCode(数据库)- 项目员工 II
LeetCode(数据库)- 项目员工 II
70 0
|
数据库
LeetCode(数据库)- 项目员工 I
LeetCode(数据库)- 项目员工 I
67 0