题面
核心思想
纯模拟!没反应过来是前序遍历~
private Map<String,List<String>> children;
表示一个人的孩子
当调用getInheritanceOrder 时 通过map 搜索答案,由于孩子也有可能有孩子,无限套娃,所以通过递归搜索建立答案。
建立答案的时候也不用考虑是否死亡,我们搜索完成后在去删除死亡的人,不过不能remove这样是o(n)的,通过LinkedList的迭代器实现o(1)的插入与删除
代码
public class ThroneInheritance {
//王伟继承顺序
private List<String> curOrder;
//一个人的所有儿子
private Map<String,List<String>> children;
//死亡标记 0表示或者 1表示死亡
private Map<String,Integer> isDead;
//国王名字
private String kingName;
public ThroneInheritance(String kingName) {
curOrder = new LinkedList<>();
children = new HashMap<>();
isDead = new HashMap<>();
this.kingName = kingName;
isDead.put(kingName, 0);
}
public void birth(String parentName, String childName) {
// 出生则添加到mp中 死亡标记置0
List<String> cd = children.getOrDefault(parentName, new LinkedList<>());
cd.add(childName);
children.put(parentName, cd);
isDead.put(childName, 0);
}
public void death(String name) {
isDead.put(name, 1);
}
public List<String> getInheritanceOrder() {
// 每次查询都清空重新查找
curOrder.clear();
// 推入国王
curOrder.add(kingName);
// 查找国王的孩子
if(children.containsKey(kingName)){
List<String> inheritanceOrderHelper = getInheritanceOrderHelper(children.get(kingName));
curOrder.addAll(inheritanceOrderHelper);
}
Iterator<String> iterator = curOrder.iterator();
//移出去世的
while(iterator.hasNext()){
String key = iterator.next();
if (isDead.get(key) == 1) {
iterator.remove();// remove 后会指向前一个元素
}
}
return curOrder;
}
private List<String> getInheritanceOrderHelper(List<String> nextTmp) {
// 这里如果不新建一个List 会影响原Map children中的List 导致数据错误
List<String> next = new LinkedList<>(nextTmp);
ListIterator<String> iterator = next.listIterator();
// 通过迭代器可以实现o(1)的添加操作
// 如果king 有 alice bob 两个孩子,其中alice 有 sasha 一个孩子
// 这里就是发现alice有孩子就会把 sasha加入到List中,List变成 alice sasha bob 然后再去找bob的孩子 保证顺序的正确性
while(iterator.hasNext()){
String key = iterator.next();
//找孩子 并把孩子接在后面
if(children.containsKey(key)){
List<String> inheritanceOrderHelper = getInheritanceOrderHelper(children.get(key));
// inheritanceOrderHelper 得到孩子List 按顺序接在父亲后面
for(String s: inheritanceOrderHelper){
iterator.add(s);// iterator add后会指向新加的元素
}
}
}
return next;
}
}
标签:顺序,String,iterator,1600,List,王位继承,curOrder,kingName,children
From: https://www.cnblogs.com/ganyq/p/18118710