1600. 王位继承顺序

题面

核心思想

纯模拟!没反应过来是前序遍历~
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;
    }
}
posted @ 2024-04-07 11:21  Shie1d  阅读(26)  评论(0)    收藏  举报