当前位置:首页 > 力扣 > 力扣690题:哈希表+BFS解决员工的重要性

力扣690题:哈希表+BFS解决员工的重要性

3个月前 (08-25)

力扣690题:哈希表+BFS解决员工的重要性 力扣题解 哈希表 广度优先搜索 广搜 BFS 队列 第1张

一、题目解读

LeetCode第690题“员工的重要性”要求给定一个员工信息数组(包含id、重要性值及下属id列表),计算指定id员工及其所有下属的总重要性。题目核心在于处理状结构数据,需遍历员工关系并累加重要性,同时考虑高效查找与遍历策略。

二、解题思路

采用“哈希表预处理+BFS遍历”的双层优化:

1. 哈希表映射:将员工信息存储于unordered_map,通过id直接O(1)查找员工对象,避免线性遍历。

2. 广度优先搜索(BFS):从目标员工开始,逐层遍历其下属,累加重要性值,确保不遗漏任何层级。

该解法兼具时间效率(O(n))与代码简洁性,适用于树状数据的广度优先处理场景。

三、解题步骤

1. 创建哈希表:遍历员工数组,将每个员工的id映射至其对象,构建emp_map。

2. 初始化队列:将目标id加入队列q,作为BFS起点。

3. BFS循环:

    弹出队首元素current_id,获取对应员工对象。

    累加其重要性至total_importance。

    将其所有下属id加入队列,扩展遍历范围。

4. 终止条件:队列为空时,所有员工已遍历完毕。

5. 返回结果:total_importance为最终总重要性。

四、代码与注释

class Solution {
public:
    int getImportance(vector<Employee*> employees, int id) {
        // 创建哈希表快速查找员工
        unordered_map<int, Employee*> emp_map;
        for (auto emp : employees) {
            emp_map[emp->id] = emp;
        }
        
        // 使用队列进行广度优先搜索(BFS)
        queue<int> q;
        q.push(id);
        int total_importance = 0;
        
        while (!q.empty()) {
            int current_id = q.front();
            q.pop();
            
            // 获取当前员工对象
            Employee* current_emp = emp_map[current_id];
            // 累加重要度
            total_importance += current_emp->importance;
            
            // 将下属加入队列
            for (int sub_id : current_emp->subordinates) {
                q.push(sub_id);
            }
        }
        
        return total_importance;
    }
};


五、总结

该解法巧妙结合哈希表的快速查找与BFS的广度遍历,将树状数据处理转化为线性操作,显著优化时间复杂度。核心启示:对于涉及多层关系的数据结构,预先构建索引(如哈希表)并采用广度优先策略,可大幅提升算法效率。对解决树/类算法问题具有通用参考价值。



原创内容 转载请注明出处

分享给朋友:

相关文章

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

洛谷P3694题解:动态规划与状态压缩优化解题全解析

洛谷P3694题解:动态规划与状态压缩优化解题全解析

一、题目解读洛谷P3694题要求解决一个多团队人数分配问题,给定n个元素和m个团队,每个元素属于一个团队,需将元素重新排列,使相邻元素属于不同团队,并最小化调整次数。题目难点在于如何高效处理团队间的空...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。