[Leetcode学习-java]Reconstruct Itinerary(重整行程表)

问题:

难度:easy

说明:

给出一堆票,然后你将它们路线从 JFK 开始,连接起来,如果有多种可能就按照前缀排序。

问题链接:https://leetcode.com/problems/reconstruct-itinerary/

输入案例:

Example 1:
Input: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Output: ["JFK", "MUC", "LHR", "SFO", "SJC"]

Example 2:
Input: [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Output: ["JFK","ATL","JFK","SFO","ATL","SFO"]
Explanation: Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"].
             But it is larger in lexical order.

我的代码:

放完端午回来整个人都散了,看了半天没思路,dp不好用,链表+hashmap感觉不行,所以去看别人的。其实最简单做法就是,弄成树,然后深度遍历。

当然为什么要弄成树,而且我dfs时候我需要删除掉树的节点,我可能要学学有向图,此外用了少用的java api。

class Solution {
    public List<String> findItinerary(List<List<String>> tickets) {
        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        // 把每张票遍历,打成树
        for(List<String> list : tickets) {
            ArrayList<String> temp = map.getOrDefault(list.get(0), new ArrayList<String>());
            map.put(list.get(0), sort(list.get(1), temp));
        }

        // 进行dfs,从JFK开始
        List<String> res = new ArrayList<String>();
        dfs(map, "JFK", res);
        return res;
    }
    
    public void dfs(HashMap<String, ArrayList<String>> map, String str, List<String> res) {
        ArrayList<String> list = map.get(str);
        // dfs有点不同就是要移除树的节点
        if(list != null)
            while(!list.isEmpty())
                dfs(map, list.remove(0), res);
        res.add(0,str);
    }
    
    // 按字符串前缀进行排序
    public ArrayList<String> sort(String str, ArrayList<String> list) {
        int size = list.size();
        for(int i = 0;i < size;i ++)
            if(str.compareTo(list.get(i)) < 0) {
                list.add(i, str);
                break;
            }
        if(size == list.size()) list.add(str);
        return list;
    }
}
扫描二维码关注公众号,回复: 11567212 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_28033719/article/details/107016853