问题:
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
.
Note:
- If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string. For example, the itinerary
["JFK", "LGA"]
has a smaller lexical order than["JFK", "LGB"]
. - All airports are represented by three capital letters (IATA code).
- You may assume all tickets form at least one valid itinerary.
Example 1:tickets
= [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Return ["JFK", "MUC", "LHR", "SFO", "SJC"]
.
Example 2:tickets
= [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Return ["JFK","ATL","JFK","SFO","ATL","SFO"]
.
Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]
. But it is larger in lexical order.
解决:
① 使用Map+DFS。
定义:
欧拉回路:从图的某一个顶点出发,图中每条边走且仅走一次,最后回到出发点;如果这样的回路存在,则称之为欧拉回路。
欧拉路径:从图的某一个顶点出发,图中每条边走且仅走一次,最后到达某一个点;如果这样的路径存在,则称之为欧拉路径。判断:
无向图欧拉回路判断:所有顶点的度数都为偶数。
有向图欧拉回路判断:所有顶点的出度与入读相等。
无向图欧拉路径判断: 至多有两个顶点的度数为奇数,其他顶点的度数为偶数。
有向图欧拉路径判断: 至多有两个顶点的入度和出度绝对值差1(若有两个这样的顶点,则必须其中一个出度大于入度,另一个入度大于出度),其他顶点的入度与出度相等。
所有机场都是顶点,票据是有向边。 然后所有这些票形成一个有向图。
因为我们知道欧拉路径存在,所以图必须是欧拉。
因此,从“JFK”开始,我们可以应用Hierholzer算法在图中找到欧拉路径,这是一个有效的重构。
由于问题要求词法顺序最小的解决方案,我们可以把邻居放在一个小堆里。 通过这种方式,我们总是先访问最小的邻居。
class Solution { //10ms
Map<String,PriorityQueue<String>> map = new HashMap<>();
List<String> res = new ArrayList<>();
public List<String> findItinerary(String[][] tickets) {
for (String[] ticket : tickets){
if (! map.containsKey(ticket[0])){
PriorityQueue<String> queue = new PriorityQueue<>();
map.put(ticket[0],queue);
}
map.get(ticket[0]).offer(ticket[1]);
}
dfs("JFK");
return res;
}
public void dfs(String s){
PriorityQueue<String> queue = map.get(s);
while(queue != null && ! queue.isEmpty()){
dfs(queue.poll());
}
res.add(0,s);
}
}