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);
}
};