当前位置: 首页 > news >正文

【C++BFS】690. 员工的重要性

本文涉及知识点

C++BFS算法

LeetCode690. 员工的重要性

你有一个保存员工信息的数据结构,它包含了员工唯一的 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 都有效。

C++BFS

根据生活常识,我们假定没有任何两位员工互为领导。如果互为领导,本题无法计算。
我们令 本人是自己的0层下属,直接下属是1层下属,直接下属的直接下属是二级下属…
leves[i]记录id 的i层下属。
BFS的状态表示:cur。
BFS的后续状态:cur的直接下属。
BFS的初始状态:leves[0] = {id};
BFS的返回值,所有的cur重要性之和。
BFS的重复处理:根据生活常识,无需处理重复。
预处理:向量vIDtoPtr记录 各id对应的员工信息。

代码

核心代码

classEmployee{public:intid;intimportance;vector<int>subordinates;};classSolution{public:intgetImportance(vector<Employee*>employees,intid){vector<Employee*>vIDToPtr(2000+1);for(auto&ptr:employees){vIDToPtr[ptr->id]=ptr;}queue<int>que;que.emplace(id);intret=0;while(que.size()){intcur=que.front();que.pop();autoptr=vIDToPtr[cur];ret+=ptr->importance;for(constauto&next:ptr->subordinates){que.emplace(next);}}returnret;}};

单元测试

namespaceLeetCode690{//LeetCode690. 员工的重要性TEST_CLASS(LeetCode690){public:classEmployee{public:intid;intimportance;vector<int>subordinates;};classSolution{public:intgetImportance(vector<Employee*>employees,intid){vector<Employee*>vIDToPtr(2000+1);for(auto&ptr:employees){vIDToPtr[ptr->id]=ptr;}queue<int>que;que.emplace(id);intret=0;while(que.size()){intcur=que.front();que.pop();autoptr=vIDToPtr[cur];ret+=ptr->importance;for(constauto&next:ptr->subordinates){que.emplace(next);}}returnret;}};vector<Employee>employees;vector<Employee*>ToPtr(vector<Employee>&employees){vector<Employee*>ret;for(auto&e:employees){ret.emplace_back(&e);}returnret;}intid;TEST_METHOD(TestMethod1){employees={{1,5,{2,3}},{2,3,{}},{3,3,{}}},id=1;autores=Solution().getImportance(ToPtr(employees),id);AssertEx(11,res);}TEST_METHOD(TestMethod2){employees={{1,2,{5}},{5,-3,{}}},id=5;autores=Solution().getImportance(ToPtr(employees),id);AssertEx(-3,res);}};}

扩展阅读

我想对大家说的话
亲士工具箱:支持AutoCad2013及以上
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019C++17
或者 操作系统:win10 开发环境: VS2022C++17
如无特殊说明,本算法用**C++**实现。

http://www.jsqmd.com/news/478575/

相关文章:

  • 【AutoSAR】只讲干货!使用EB Tresos配置Port
  • 终极指南:Upspin核心架构完全解析——三大服务如何构建全球命名系统
  • 【亲测免费】推荐项目:Dubbo Spring Boot Starter - 简化你的微服务开发
  • 从XML到JSON:Proteus如何革命性重构Android动态布局开发
  • 【亲测免费】 推荐使用:KCloud-Platform-IoT - 超强微服务架构的物联网云平台
  • SpringBoot集成RestTemplate请求高德地图API
  • PyCaret批量预测:处理大规模推理任务的终极指南
  • 排序——快速排序
  • MessagePack-CSharp未来发展方向:终极路线图与功能规划指南
  • 10个终极API安全测试技巧:awesome-web-hacking实战指南
  • 如何使用IPED进行文件类型统计趋势分析:掌握数字证据随时间变化的关键技巧
  • Python枚举类型完全指南:从入门到精通的10个实用技巧
  • 掌握mmdetection模型剪枝技术:通道剪枝与结构剪枝完整指南
  • vue3横向滚动日期选择器组件(Element Plus)
  • 空间函数在 ABAP SQL 里到底是什么
  • 【JEECG】JVxeTable表格行样式错位、底部滚动条错位
  • React组件更新终极指南:从setState到Fiber树的完整解析
  • 搞懂 spatial reference system:为什么 SRID 才是 SAP 空间开发里最容易被低估的基础设施
  • pt转onnx转ncnn模型(yolov8部署安卓)
  • .vscode配置文件备份
  • 搞懂 ABAP 里的 Heap 引用与 Stack 引用:从内存语义到失效边界
  • 解决protobuf版本冲突:从ImportError到streamlit顺利运行的实战指南
  • 【工具-VMware Workstation-ubuntu】
  • ProcessHacker文件锁定检测:解决应用程序文件占用问题
  • pt转onnx转rknn(yolov5部署RK3566)
  • NotebookLM:Google Labs 如何用 AI 重塑知识管理体验
  • 读懂 ABAP 中的 tag interface:从语义标记到运行时契约的设计逻辑
  • 创业者必看:150+优质平台助你快速获取种子用户
  • Xcode 16及升级 Xcode 26 编译弹窗问题、编译通过无法,编译通过打包等问题汇总
  • 深入解析JESD79-5中的模式寄存器操作:MRR与MRW实战指南