comments | difficulty | edit_url | tags | |||||
---|---|---|---|---|---|---|---|---|
true |
中等 |
|
你有一个保存员工信息的数据结构,它包含了员工唯一的 id ,重要度和直系下属的 id 。
给定一个员工数组 employees
,其中:
employees[i].id
是第i
个员工的 ID。employees[i].importance
是第i
个员工的重要度。employees[i].subordinates
是第i
名员工的直接下属的 ID 列表。
给定一个整数 id
表示一个员工的 ID,返回这个员工和他所有下属的重要度的 总和。
示例 1:
输入:employees = [[1,5,[2,3]],[2,3,[]],[3,3,[]]], id = 1 输出:11 解释: 员工 1 自身的重要度是 5 ,他有两个直系下属 2 和 3 ,而且 2 和 3 的重要度均为 3 。因此员工 1 的总重要度是 5 + 3 + 3 = 11 。
示例 2:
输入:employees = [[1,2,[5]],[5,-3,[]]], id = 5 输出:-3 解释:员工 5 的重要度为 -3 并且没有直接下属。 因此,员工 5 的总重要度为 -3。
提示:
1 <= employees.length <= 2000
1 <= employees[i].id <= 2000
- 所有的
employees[i].id
互不相同。 -100 <= employees[i].importance <= 100
- 一名员工最多有一名直接领导,并可能有多名下属。
employees[i].subordinates
中的 ID 都有效。
我们用一个哈希表
时间复杂度
"""
# Definition for Employee.
class Employee:
def __init__(self, id: int, importance: int, subordinates: List[int]):
self.id = id
self.importance = importance
self.subordinates = subordinates
"""
class Solution:
def getImportance(self, employees: List["Employee"], id: int) -> int:
def dfs(i: int) -> int:
return d[i].importance + sum(dfs(j) for j in d[i].subordinates)
d = {e.id: e for e in employees}
return dfs(id)
/*
// Definition for Employee.
class Employee {
public int id;
public int importance;
public List<Integer> subordinates;
};
*/
class Solution {
private final Map<Integer, Employee> d = new HashMap<>();
public int getImportance(List<Employee> employees, int id) {
for (var e : employees) {
d.put(e.id, e);
}
return dfs(id);
}
private int dfs(int i) {
Employee e = d.get(i);
int s = e.importance;
for (int j : e.subordinates) {
s += dfs(j);
}
return s;
}
}
/*
// Definition for Employee.
class Employee {
public:
int id;
int importance;
vector<int> subordinates;
};
*/
class Solution {
public:
int getImportance(vector<Employee*> employees, int id) {
unordered_map<int, Employee*> d;
for (auto& e : employees) {
d[e->id] = e;
}
function<int(int)> dfs = [&](int i) -> int {
int s = d[i]->importance;
for (int j : d[i]->subordinates) {
s += dfs(j);
}
return s;
};
return dfs(id);
}
};
/**
* Definition for Employee.
* type Employee struct {
* Id int
* Importance int
* Subordinates []int
* }
*/
func getImportance(employees []*Employee, id int) int {
d := map[int]*Employee{}
for _, e := range employees {
d[e.Id] = e
}
var dfs func(int) int
dfs = func(i int) int {
s := d[i].Importance
for _, j := range d[i].Subordinates {
s += dfs(j)
}
return s
}
return dfs(id)
}
/**
* Definition for Employee.
* class Employee {
* id: number
* importance: number
* subordinates: number[]
* constructor(id: number, importance: number, subordinates: number[]) {
* this.id = (id === undefined) ? 0 : id;
* this.importance = (importance === undefined) ? 0 : importance;
* this.subordinates = (subordinates === undefined) ? [] : subordinates;
* }
* }
*/
function getImportance(employees: Employee[], id: number): number {
const d = new Map<number, Employee>();
for (const e of employees) {
d.set(e.id, e);
}
const dfs = (i: number): number => {
let s = d.get(i)!.importance;
for (const j of d.get(i)!.subordinates) {
s += dfs(j);
}
return s;
};
return dfs(id);
}
/**
* Definition for Employee.
* function Employee(id, importance, subordinates) {
* this.id = id;
* this.importance = importance;
* this.subordinates = subordinates;
* }
*/
/**
* @param {Employee[]} employees
* @param {number} id
* @return {number}
*/
var GetImportance = function (employees, id) {
const d = new Map();
for (const e of employees) {
d.set(e.id, e);
}
const dfs = i => {
let s = d.get(i).importance;
for (const j of d.get(i).subordinates) {
s += dfs(j);
}
return s;
};
return dfs(id);
};