g0301_0400.s0332_reconstruct_itinerary.Solution Maven / Gradle / Ivy
package g0301_0400.s0332_reconstruct_itinerary;
// #Hard #Depth_First_Search #Graph #Eulerian_Circuit
// #2022_07_10_Time_4_ms_(100.00%)_Space_43_MB_(91.20%)
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
/**
* 332 - Reconstruct Itinerary\.
*
* Hard
*
* You are given a list of airline `tickets` where tickets[i] = [fromi, toi] represent the departure and the arrival airports of one flight. Reconstruct the itinerary in order and return it.
*
* All of the tickets belong to a man who departs from `"JFK"`, thus, the itinerary must begin with `"JFK"`. 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"]`.
*
* You may assume all tickets form at least one valid itinerary. You must use all the tickets once and only once.
*
* **Example 1:**
*
* 
*
* **Input:** tickets = \[\["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]]
*
* **Output:** ["JFK","MUC","LHR","SFO","SJC"]
*
* **Example 2:**
*
* 
*
* **Input:** tickets = \[\["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.
*
* **Constraints:**
*
* * `1 <= tickets.length <= 300`
* * `tickets[i].length == 2`
* * fromi.length == 3
* * toi.length == 3
* * fromi and toi consist of uppercase English letters.
* * fromi != toi
**/
public class Solution {
public List findItinerary(List> tickets) {
HashMap> map = new HashMap<>();
LinkedList ans = new LinkedList<>();
for (List ticket : tickets) {
String src = ticket.get(0);
String dest = ticket.get(1);
PriorityQueue pq = map.getOrDefault(src, new PriorityQueue<>());
pq.add(dest);
map.put(src, pq);
}
dfs(map, "JFK", ans);
return ans;
}
private void dfs(Map> map, String src, LinkedList ans) {
PriorityQueue temp = map.get(src);
while (temp != null && !temp.isEmpty()) {
String nbr = temp.remove();
dfs(map, nbr, ans);
}
ans.addFirst(src);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy