難度:Hard
描述:你會得到一個航空票的列表,其中 tickets[i] = [fromi, toi] 表示一次航班的出發機場和到達機場。按照順序重建行程。
所有的機票都屬於一個從“JFK”出發的人,因此行程必須從“JFK”開始。如果有多個有效的行程,你應該返回在作為單一字符串讀取時具有最小字典順序的行程。
例如,行程["JFK", "LGA"] 的字典順序比["JFK", "LGB"]小。
你可以假定所有機票至少形成一個有效的行程。你必須使用所有的機票,而且只能使用一次。
方法一 (DFS):
思路:
1.建立路徑圖(graph),從起始機場至目標機場。
2.排序目標機場的順序,使每次都以字典順序小的優先走訪。
3.DFS遞迴走訪,起始機場至目標機場,由"JFK"開始。
4.由根部節點機場,即無下一個目標機場,節點加入行程(itinerary)。
5.反轉行程列表,因為行程是在回溯中建立的。
Time Complexity : O( N log N)
Runtime : 15 ms (89.66%)
Memory : 14.59 MB (58.51%)
class Solution {
public:
void dfs(string airport, unordered_map<string, priority_queue<string, vector<string>, greater<string>>> &graph, vector<string> &itinerary) {
while (!graph[airport].empty()) {
string next_airport = graph[airport].top();
graph[airport].pop();
dfs(next_airport, graph, itinerary);
}
itinerary.push_back(airport);
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
unordered_map<string, priority_queue<string, vector<string>, greater<string>>> graph;
for (auto &ticket : tickets) {
graph[ticket[0]].push(ticket[1]);
}
vector<string> itinerary;
dfs("JFK", graph, itinerary);
reverse(itinerary.begin(), itinerary.end());
return itinerary;
}
};
沒有留言:
張貼留言