标签:
/* * 332. Reconstruct Itinerary * 2016-3-14 by Mingyang * 这道题给我们一堆飞机票,让我们建立一个行程单,如果有多种方法,取其中字母顺序小的那种方法。 * 这道题的本质是有向图的遍历问题,那么LeetCode关于有向图的题只有两道Course Schedule和Course Schedule II, * 而那两道是关于有向图的顶点的遍历的,而本题是关于有向图的边的遍历。!!!!!!!!!!!!!!!!!! * 每张机票都是有向图的一条边,我们需要找出一条经过所有边的路径,那么DFS是我们的不二选择。 * 代码前半段都在准备工作。把所有的tickets全部装进一个map,string对应了一个priority queue * 后半段dfs中,找出第一个顺序的结果。最终输出是从最后一个开始,一个一个往前退的情况下addFirst加起来的 * 关键点:记住,我们这里是一个一个往后退的!! */ HashMap<String, PriorityQueue<String>> map = new HashMap<String, PriorityQueue<String>>(); LinkedList<String> result = new LinkedList<String>(); public List<String> findItinerary(String[][] tickets) { for (String[] ticket : tickets) { if (!map.containsKey(ticket[0])) { PriorityQueue<String> q = new PriorityQueue<String>(); map.put(ticket[0], q); }//用PQ代表了一个顺序 map.get(ticket[0]).offer(ticket[1]); } dfs("JFK"); return result; } public void dfs(String s) { PriorityQueue<String> q = map.get(s); while (q != null && !q.isEmpty()) { dfs(q.poll()); } result.addFirst(s); }
标签:
原文地址:http://www.cnblogs.com/zmyvszk/p/5657056.html