目录
1. 题目描述
给定一个保存员工信息的数据结构,它包含了员工 唯一的 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 。
提示:
一个员工最多有一个 直系 领导,但是可以有多个 直系 下属
员工数量不超过 2000 。
2. 解题分析
这其实可以看作是一个树的遍历的问题。求某个员工的重要性相当于求以该员工节点为根的子树的所有节点的重要性之和。当然,本问题比较简单,所以不需要显式地构造出树来。
以下代码实现中,首先,由于输入信息是列表形式,先要基于此构造出Employee对象列表(其实不一定非要如此,只不过leetcode原题给出的接口是这样定义的)。其次,定义了一个helper函数findE(id)用于搜索对应所给id的节点(列表中的某元素)。最然,以递归调用的方式实现了等价于子树遍历的处理。
3. 代码实现
from typing import List
# 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 findE(id):
for e in employees:
if e.id == id:
return e
def aaa(e):
# print(e)
impsum = e.importance
for subId in e.subordinates:
impsum += aaa(findE(subId))
return impsum
return aaa(findE(id))
if __name__ == '__main__':
sln = Solution()
# Create a list of Employee object first.
employees = []
employee_list = [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]]
for emp in employee_list:
employees.append(Employee(emp[0],emp[1],emp[2]))
id = 1
print(sln.getImportance(employees, id))
employees = []
employee_list = [[1, 15, [2]], [2, 10, [3]], [3, 5, []]]
for emp in employee_list:
employees.append(Employee(emp[0],emp[1],emp[2]))
id = 1
print(sln.getImportance(employees, id))
本系列总目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)https://chenxiaoyuan.blog.csdn.net/article/details/123040889