332.Reconstruct-Itinerary

332. Reconstruct Itinerary

题目地址

https://leetcode.com/problems/reconstruct-itinerary/

题目描述

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.

代码

Approach #1 Backtracking + Greedy

class Solution {
  HashMap<String, List<String>> flightMap = new HashMap<>();
  HashMap<String, boolean[]> visitBitmap = new HashMap<>();
  int flights = 0;
  List<String> result = null;

  public List<String> findItinerary(List<List<String>> tickets) {
        for (List<String> ticket: tickets) {
      String origin = ticket.get(0);
      String dest = ticket.get(1);
      if (this.flightMap.containsKey(origin)) {
        List<String> destList = flightMap.get(origin);
        destList.add(dest);
      } else {
        List<String> destList = new LinkedList<String>();
        destList.add(dest);
        flightMap.put(origin, destList);
      }
    }

    for (Map.Entry<String, List<String>> entry: flightMap.entrySet()) {
      Collections.sort(entry.getValue());
      visitBitmap.put(entry.getKey(), new boolean[entry.getValue().size()]);
    }

    flights = tickets.size();
    LinkedList<String> route = new LinkedList<String>();

    backtracking("JFK", route);
    return result;
  }

  private boolean backtracking(String origin, LinkedList<String> route) {
    if (route.size() == flights + 1) {
      result = (List<String>) route.clone();
        return true;
    }

    if (!this.flightMap.containsKey(origin))        return false;

    int i = 0;
    boolean[] bitmap = visitBitmap.get(origin);

    for (String dest: flightMap.get(origin)) {
      if (!bitmap[i]) {
        bitmap[i] = true;
        route.add(dest);
        boolean ret = backtracking(dest, route);
        route.pollLast();
        bitmap[i] = false;

        if (ret)     return true;
      }
      i++;
    }

    return false;
  }
}

Last updated