-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy path0332. Reconstruct Itinerary.js
55 lines (50 loc) · 1.83 KB
/
0332. Reconstruct Itinerary.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 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:
//
// 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.
/**
* @param {string[][]} tickets
* @return {string[]}
*/
// Sort children + post-order traversal, Backtracking
// https://www.youtube.com/watch?v=4udFSOWQpdg
//
// Time O(n log n), worst case: one 'from' and the rest are all 'tos', and sort on 'tos'
const findItinerary = (tickets) => {
// create graph
const graph = {};
for (const [from, to] of tickets) {
if (graph[from] == null) graph[from] = [];
graph[from].push(to);
}
for (const from in graph) {
graph[from].sort(); // sort 'tos' in lexical order
}
// Post-order traversal, DFS
const route = [];
const go = (from) => {
const tos = graph[from] || [];
while (tos.length) {
const to = tos.shift(); // get the lexical smallest 'to'
go(to);
}
route.push(from);
};
go('JFK');
return route.reverse();
};