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


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

    题目:

    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;
        }
    }

    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<>();
            String cur = "JFK";
            dfs(map, cur, res);
            Collections.reverse(res);
            return res;
        }
        private void dfs(Map<String, List<String>> map, String node, List<String> res) {
            //如果能继续向下递归,则继续
            while (map.containsKey(node) && !map.get(node).isEmpty()) {
                String next = map.get(node).get(0);
                map.get(node).remove(0);
                dfs(map, next, res);
            }
            //否则将该点加入结果
            res.add(node);
        }
    }
  • 相关阅读:
    Java 8的新并行API
    java lambda表达式
    用Java反射输出对象的所有属性的值
    整数划分问题
    比较常用的几个正则表达式
    bilibili的下载文件可以有多深
    vim中的宏和normal命令
    vim与正则表达式
    Manjaro软件推荐
    解决无法更新
  • 原文地址:https://www.cnblogs.com/shawshawwan/p/9888509.html
Copyright © 2020-2023  润新知