leetcode [690]员工的重要性(BFS或DFS搜索,打工人五一快乐~)

本文介绍了一种算法,用于计算特定员工及其所有下属的重要度之和。通过构建员工间的关系图并利用广度优先搜索或深度优先搜索算法遍历员工结构,实现高效计算。
# 给定一个保存员工信息的数据结构,它包含了员工 唯一的 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 = 1
# 1 。
#  
# 
#  
# 
#  提示: 
# 
#  
#  一个员工最多有一个 直系 领导,但是可以有多个 直系 下属 
#  员工数量不超过 2000 。 
#  
#  Related Topics 深度优先搜索 广度优先搜索 哈希表 
class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        relations = {}
        imps = {}
        for emp in employees:
            i = emp.id
            imp = emp.importance
            subs = emp.subordinates
            relations[i] = []
            imps[i] = imp
            for sub in subs:
                relations[i].append(sub)
        ret = 0
        que = deque()
        que.append(id)
        while que:
            i = que.popleft()
            ret += imps[i]
            if i in relations.keys():
                for sub in relations[i]:
                    que.append(sub)
        return ret
# leetcode submit region end(Prohibit modification and deletion)

用邻接表来存储上司到员工的关系,建立了relations字典;又建立了imps字典存储员工关键度。最后使用广度优先搜索累加关键度即可。

存在问题是,不够pythonic。

其实本题只需存储id到Employee的映射即可,加上python的列表推导能写的很优雅。改写后的代码如下:

class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        relations = {emp.id: emp for emp in employees}
        ret = 0
        que = deque([id])
        while que:
            i = que.popleft()
            ret += relations[i].importance
            for sub in relations[i].subordinates:
                que.append(sub)
        return ret

另外附上dfs版解法:

class Solution:
    def getImportance(self, employees: List['Employee'], id: int) -> int:
        relations = {emp.id: emp for emp in employees}

        def dfs(id):
            emp = relations[id]
            return emp.importance + sum(dfs(i) for i in emp.subordinates)
        
        return dfs(id)

直接调用sum计算列表推导式的结果,python真是s啊。

五一出的题很应景,打工人节日快乐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值