文章目录

  • 1. 题目
  • 2. 解题

1. 题目

一个王国里住着国王、他的孩子们、他的孙子们等等。每一个时间点,这个家庭里有人出生也有人死亡。

这个王国有一个明确规定的皇位继承顺序,第一继承人总是国王自己。我们定义递归函数 Successor(x, curOrder) ,给定一个人 x 和当前的继承顺序,该函数返回 x 的下一继承人。

Successor(x, curOrder):如果 x 没有孩子或者所有 x 的孩子都在 curOrder 中:如果 x 是国王,那么返回 null否则,返回 Successor(x 的父亲, curOrder)否则,返回 x 不在 curOrder 中最年长的孩子

比方说,假设王国由国王,他的孩子 Alice 和 Bob (Alice 比 Bob 年长)和 Alice 的孩子 Jack 组成。

一开始, curOrder 为 [“king”].
调用 Successor(king, curOrder) ,返回 Alice ,所以我们将 Alice 放入 curOrder 中,得到 [“king”, “Alice”] 。
调用 Successor(Alice, curOrder) ,返回 Jack ,所以我们将 Jack 放入 curOrder 中,得到 [“king”, “Alice”, “Jack”] 。
调用 Successor(Jack, curOrder) ,返回 Bob ,所以我们将 Bob 放入 curOrder 中,得到 [“king”, “Alice”, “Jack”, “Bob”] 。
调用 Successor(Bob, curOrder) ,返回 null 。最终得到继承顺序为 [“king”, “Alice”, “Jack”, “Bob”] 。
通过以上的函数,我们总是能得到一个唯一的继承顺序。

请你实现 ThroneInheritance 类:

  • ThroneInheritance(string kingName) 初始化一个 ThroneInheritance 类的对象。
    国王的名字作为构造函数的参数传入。
  • void birth(string parentName, string childName) 表示 parentName 新拥有了一个名为 childName 的孩子。
  • void death(string name) 表示名为 name 的人死亡。
    一个人的死亡不会影响 Successor 函数,也不会影响当前的继承顺序。你可以只将这个人标记为死亡状态。
  • string[] getInheritanceOrder() 返回 除去 死亡人员的当前继承顺序列表。
示例:
输入:
["ThroneInheritance", "birth", "birth", "birth", "birth", "birth", "birth", "getInheritanceOrder", "death", "getInheritanceOrder"]
[["king"], ["king", "andy"], ["king", "bob"], ["king", "catherine"], ["andy", "matthew"], ["bob", "alex"], ["bob", "asha"], [null], ["bob"], [null]]
输出:
[null, null, null, null, null, null, null, ["king", "andy", "matthew", "bob", "alex", "asha", "catherine"], null, ["king", "andy", "matthew", "alex", "asha", "catherine"]]解释:
ThroneInheritance t= new ThroneInheritance("king"); // 继承顺序:king
t.birth("king", "andy"); // 继承顺序:king > andy
t.birth("king", "bob"); // 继承顺序:king > andy > bob
t.birth("king", "catherine"); // 继承顺序:king > andy > bob > catherine
t.birth("andy", "matthew"); // 继承顺序:king > andy > matthew > bob > catherine
t.birth("bob", "alex"); // 继承顺序:king > andy > matthew > bob > alex > catherine
t.birth("bob", "asha"); // 继承顺序:king > andy > matthew > bob > alex > asha > catherine
t.getInheritanceOrder(); // 返回 ["king", "andy", "matthew", "bob", "alex", "asha", "catherine"]
t.death("bob"); // 继承顺序:king > andy > matthew > bob(已经去世)> alex > asha > catherine
t.getInheritanceOrder(); // 返回 ["king", "andy", "matthew", "alex", "asha", "catherine"]提示:
1 <= kingName.length, parentName.length, childName.length, name.length <= 15
kingName,parentName, childName 和 name 仅包含小写英文字母。
所有的参数 childName 和 kingName 互不相同。
所有 death 函数中的死亡名字 name 要么是国王,要么是已经出生了的人员名字。
每次调用 birth(parentName, childName) 时,测试用例都保证 parentName 对应的人员是活着的。
最多调用 10^5 次birth 和 death 。
最多调用 10 次 getInheritanceOrder 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/throne-inheritance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class ThroneInheritance {unordered_map<string, vector<string>> g;unordered_set<string> passaway;string king;
public:ThroneInheritance(string kingName) {king = kingName;g[kingName];}void birth(string parentName, string childName) {g[parentName].push_back(childName);//建图}void death(string name) {passaway.insert(name);//记录去世的}vector<string> getInheritanceOrder() {vector<string> ans;dfs(king, ans);//深度优先搜索return ans;}void dfs(string& people, vector<string>& ans){if(passaway.find(people) == passaway.end())ans.push_back(people);//继承人存活for(auto& child : g[people])dfs(child, ans);}
};

1084 ms 166.6 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1600. 皇位继承顺序(图的深度优先遍历)相关推荐

  1. leetcode 1600. 皇位继承顺序(dfs)

    题目 一个王国里住着国王.他的孩子们.他的孙子们等等.每一个时间点,这个家庭里有人出生也有人死亡. 这个王国有一个明确规定的皇位继承顺序,第一继承人总是国王自己.我们定义递归函数 Successor( ...

  2. 1600. 皇位继承顺序

    文章目录 题目描述 解题思路 代码实现 参考文献 1600. 皇位继承顺序 题目描述 解题思路 1.哈希表保存父子间的关系 2.保存死亡名单 3.前序遍历多叉树获取继承顺序并排除已死亡人员 代码实现 ...

  3. 实验报告C语言实现图的深度遍历,图的深度优先遍历的C语言实现.pdf

    图的深度优先遍历的C语言实现.pdf 维普资讯 九 江 职 业 技 术 学 院 学 报 JournalofJiujiangVocational&TechnicalCollege 2004.2 ...

  4. 数据结构 图的深度优先遍历 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Bool ...

  5. java语言实现图的深度优先遍历

    java语言实现图的深度优先遍历: 图的存储采用的是邻接矩阵存储的方式,对下面的无向图进行遍历 代码如下: public class Deep {int count=0;public static v ...

  6. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  7. C++实现图的深度优先遍历和广度优先遍历

    图的深度和广度优先遍历 图的深度优先遍历 1.算法思想 2.邻接矩阵构造图 3.邻接表构造图 图的广度优先遍历 1.算法思想 2.邻接矩阵构造图 图的深度优先遍历 1.算法思想 (1)从图中的某个初始 ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  9. 邻接矩阵存储图的深度优先遍历

    练习6.1 邻接矩阵存储图的深度优先遍历 (20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visi ...

最新文章

  1. Python图像处理:图像腐蚀与图像膨胀
  2. Git 经常使用命令总结
  3. python 通过pip安装库 pycharm里面使用第三方库
  4. 理解字节序(大小端)
  5. Spring boot 整合WebSocket
  6. apdu 移动sim_SIM卡APDU指令
  7. 用php打竖的文字_手写php函数处理 竖排文字
  8. [无线]无线传输距离预估计算
  9. Android.mk编译错误 FAILED: ninja: unknown target ‘MODULES-IN-packages-apps-XXXX‘
  10. 平均查找长度 (ASL)
  11. Navicat 连接数据库报错:1045-Access denied for user ‘root‘@‘localhos
  12. 7月18百度测试实习生二面经历
  13. Bye 2019,Hi ,我的鼠年 2020 ~
  14. HTTP 新增的 103 状态码,这次终于派上用场了!
  15. python股票查询系统_使用python获取股票的上市日期等基本信息
  16. iOS 启动页加入动态的广告实现
  17. Hive_处理NULL的几个函数 NVL, COALESCE, NULLIF
  18. AMBER:对单个复合物进行分子动力学模拟的python包(resp计算电荷及gpu加速版本)
  19. 基于AI恶意软件分类技术(5)
  20. Leetcode 874. Walking Robot Simulation

热门文章

  1. linux的wine启动软件报错:err:font:add_replace_font not found suitable family L“MS Shell Dlg“
  2. 数字与表达式——字符串
  3. 一感冒就得红眼病,而且很严重怎么办
  4. 股票level2数据接口获取逐笔成交数据的过程
  5. 家用宽带电脑传输速率达到1000Mbps/1000Mbps设置方法
  6. 常用数据库的特点、应用场景信息整理
  7. 状态机在马蜂窝机票订单交易系统中的应用与优化实践
  8. leetcode-从双倍数组中还原原数组
  9. 零基础深度学习对金县房价预测
  10. echarts自定义柱状图柱体形状