欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

332.重新安排行程

程序员文章站 2022-04-24 12:38:12
...

332.重新安排行程

332.重新安排行程

题解

​ 本题的题意就是找到以JFK为起点的欧拉通路,而且需要找到字典序最小的那个结果。所以我们使用优先队列来实现,普通的队列的特点是先进先出,优先队列的特点是先弹出优先度最高的节点。但我们如果直接走字典序最小的路,可能会走到一个死胡同,无法达成使用每一张机票的目的,所以我们要把会走到死胡同的节点放到最后遍历。

​ 至于如何实现,只要该节点还没走到死胡同,就继续递归,递归不会停止。直至遇到死胡同,然后从死胡同那个节点开始入栈,再将栈内容反转即可。

class Solution {
    Map<String, PriorityQueue<String>> map = new HashMap<String, PriorityQueue<String>>();
    List<String> itinerary = new LinkedList<String>();

    public List<String> findItinerary(List<List<String>> tickets) {
        for (List<String> ticket : tickets) {
            String src = ticket.get(0), dst = ticket.get(1);
            if (!map.containsKey(src)) {
                map.put(src, new PriorityQueue<String>());
            }
            map.get(src).offer(dst);
        }
        dfs("JFK");
        Collections.reverse(itinerary);
        return itinerary;
    }

    public void dfs(String curr) {
        while (map.containsKey(curr) && map.get(curr).size() > 0) {
            String tmp = map.get(curr).poll();
            dfs(tmp);
        }
        itinerary.add(curr);
    }
}
相关标签: Leetcode