690. 员工的重要性(C++)

题目

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

分析与题解

因为所给的数据是自定义的结构体,因此先使用无序图将职员信息进行保存。然后采用深搜的方法,遍历所有下属职员累加重要值。

因为函数的迭代发在在for循环中,所以importance不需要设置为形参进行传递

代码如下:

/*
// Definition for Employee.
class Employee {
public:
    int id;
    int importance;
    vector<int> subordinates;
};
*/

class Solution {
public:
    //无序图考虑进行引用传递,,减少参数和副本量
    int getSum(unordered_map<int, Employee*> &stuff, int id){
        //如果图中不存在id编号,则返回0
        if(stuff.count(id)==0)
            return 0;
        //如果该编号对应的项存在,但是其指向结构体的指针为空,则也返回0.
        if(stuff[id]==nullptr)
            return 0;

        //设置变量ans存储重要值,先初始化为起始员工的重要值
        int ans = stuff[id]->importance;
        for(auto i : stuff[id]->subordinates){
            ans += getSum(stuff, i);
        }
        return ans;
    }
    //vector中存储的是结构体的指针形式
    int getImportance(vector<Employee*> employees, int id) {
        //先使用无序图保存职员信息
        unordered_map<int, Employee*> stuff;
        for(auto i: employees){
            //排除容器中包括不指向结构体的空指针
            if(i==nullptr)
                continue;
            stuff[i->id] = i;
        }
        return getSum(stuff, id);
    }
};
posted @ 2020-09-08 20:17  脱线森林`  阅读(114)  评论(0编辑  收藏  举报