码迷,mamicode.com
首页 > 其他好文 > 详细

332. Reconstruct Itinerary --- DFS转迭代,用栈

时间:2018-11-01 12:35:16      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:The   处理   tick   bfs   reverse   size   else   重建   nta   

好久没写题解了,今天做了一道图题,觉得解法很不错。

 

题目:

Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], reconstruct the itinerary in order. All of the tickets belong to a man who departs from JFK. Thus, the itinerary must begin with JFK.

 

重建行程,边会重复,要求是将所有行程都串起来,多种结果,返回字母序小的;

分析:本来我的想法是用BFS,但是不好处理字母序列,每次都取左小的一个,但是可能会导致有的边没有被遍历到;

解答是用DFS,一只向前走,如果走完终点了则将该点加入结果,最后结果逆序下;

比较巧妙的是非递归的解法,借助栈实现的:

 

 

/**
非递归---迭代的方法,使用栈
*/

class Solution {
    public List<String> findItinerary(String[][] tickets) {
        Map<String, List<String>> map = new HashMap<>();
        for (String[] ticket : tickets) {
            String start = ticket[0];
            String end = ticket[1];
            if (!map.containsKey(start)) {
                map.put(start, new ArrayList<>());
            }
            map.get(start).add(end);
        }
        for (String node : map.keySet()) {
            Collections.sort(map.get(node));
        }
        List<String> res = new ArrayList<>();
        Stack<String> stack = new Stack<>();
        stack.push("JFK");
        while (!stack.isEmpty()) {
            String cur = stack.peek();
            if (map.containsKey(cur) && map.get(cur).size() > 0) {  //还能前进
                String next = map.get(cur).get(0);
                map.get(cur).remove(0);
                stack.push(next);
            } else {  //不能前进了,则出栈,加入结果
                res.add(cur);
                stack.pop();
            }
        }
        Collections.reverse(res);
        return res;
    }
}

 

332. Reconstruct Itinerary --- DFS转迭代,用栈

标签:The   处理   tick   bfs   reverse   size   else   重建   nta   

原文地址:https://www.cnblogs.com/shawshawwan/p/9888509.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!