All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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:**
 *
 * ![](https://assets.leetcode.com/uploads/2021/03/14/itinerary1-graph.jpg)
 *
 * **Input:** tickets = \[\["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]]
 *
 * **Output:** ["JFK","MUC","LHR","SFO","SJC"] 
 *
 * **Example 2:**
 *
 * ![](https://assets.leetcode.com/uploads/2021/03/14/itinerary2-graph.jpg)
 *
 * **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