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

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

2个月前 (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的广度遍历,将树状数据处理转化为线性操作,显著优化时间复杂度。核心启示:对于涉及多层关系的数据结构,预先构建索引(如哈希表)并采用广度优先策略,可大幅提升算法效率。对解决树/类算法问题具有通用参考价值。



原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

力扣2588题解:利用前缀异或和与哈希表求解美丽子数组问题

一、题目解读力扣2588题要求计算给定数组中“美丽子数组”的数量。所谓“美丽子数组”,是指子数组的异或和为0。题目关键在于理解子数组异或和的性质,并通过高效算法统计符合条件的子数组数量。二、解题思路采...

发表评论

访客

看不清,换一张

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