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 fromJFK
. Thus, the itinerary must begin withJFK
.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.
不想多说什么,优化点在于消除一些冗余操作:
class Solution {
public:
unordered_map<string, multiset<string>> M;
vector<string> result, tem;
int ticket_cnt = 0;
bool found = false;
vector<string> findItinerary(vector<pair<string, string>> tickets) {
ticket_cnt = tickets.size();
// cout << ("ATL" < "SFO") << endl;
for(int i = 0; i < tickets.size(); ++i){
M[tickets[i].first].insert(tickets[i].second);
}
// result.push_back("JFK");
dfs(0, "JFK");
return vector<string>(result.rbegin(), result.rend());
}
void dfs(int cur_num, string cur_node){
if(found) return;
if(cur_num == ticket_cnt){
found = true;
}
while(!M[cur_node].empty()){
string nxt = *(M[cur_node].begin());
M[cur_node].erase(M[cur_node].begin());
// result.push_back(nxt);
dfs(cur_num+1, nxt);
}
result.push_back(cur_node);
}
};