給定乙個機票的字串二維陣列[from, to]
,子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從jfk(甘迺迪國際機場)出發的先生,所以該行程必須從 jfk 出發。
說明:
如果存在多種有效的行程,你可以按字元自然排序返回最小的行程組合。例如,行程 ["jfk", "lga"] 與 ["jfk", "lgb"] 相比就更小,排序更靠前
所有的機場都用三個大寫字母表示(機場**)。
假定所有機票至少存在一種合理的行程。
示例 1:
輸入:[["muc", "lhr"], ["jfk", "muc"], ["sfo", "sjc"], ["lhr", "sfo"]]
輸出:["jfk", "muc", "lhr", "sfo", "sjc"]
示例 2:
輸入:[["jfk","sfo"],["jfk","atl"],["sfo","atl"],["atl","jfk"],["atl","sfo"]]
輸出:["jfk","atl","jfk","sfo","atl","sfo"]
解釋:另一種有效的行程是 ["jfk","sfo","atl","jfk","atl","sfo"]。但是它自然排序更大更靠後。
思路:這個題目實際上是尤拉路徑問題(一筆畫問題):
概念科普:
若乙個圖為尤拉圖或半尤拉圖都可以通過一筆畫遍歷。
通過圖(有向圖或無向圖)中的所有邊且每一條邊僅通過一次的通路稱為尤拉通路,若此通路為迴路則稱為尤拉迴路。
具有尤拉迴路的圖稱為尤拉圖,具有尤拉通路而無尤拉迴路的圖稱為半尤拉圖。
dfs來解決:
1、採用鄰接表來表示有向圖,但是要注意兩個機場間可能有多張機票,所有還要多乙個計數。
抽象成乙個map> &m,裡面存每乙個頂點的後繼頂點,int是機票數。
2、由於題目要求按照字母順序排序,所以用map替代unordered_map, unordered_map是雜湊表,map是紅黑樹,輸出有序的。
unordered_map查詢時間複雜度o(1),map查詢時間複雜度o(logn)。這裡犧牲查詢時間換輸出有序功能。
3、設定標記陣列,如果該行程沒有機票剩餘,直接跳過。
4、如果已經找到第乙個字典序結果,直接返回,避免繼續for迴圈,re被後面的字典序較大的結果覆蓋。
class solution
for(auto x: m[temp.back()])
}vectorfinditinerary(vector>& tickets)
vectortemp;
temp.push_back("jfk");
dfs(temp, m, v, tickets.size()+1);
return re;
}};
332 重新安排行程
題目描述 如果存在多種有效的行程,請你按字元自然排序返回最小的行程組合。例如,行程 jfk lga 與 jfk lgb 相比就更小,排序更靠前 所有的機場都用三個大寫字母表示 機場 假定所有機票至少存在一種合理的行程。所有的機票必須都用一次 且 只能用一次。示例 1 輸入 muc lhr jfk m...
332 重新安排行程
給定乙個機票的字串二維陣列 from,to 子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從 jfk 甘迺迪國際機場 出發的先生,所以該行程必須從 jfk 開始。說明 如果存在多種有效的行程,你可以按字元自然排序返回最小的行程組合。例如,行程 j...
Leetcode 332 重新安排行程
給定乙個機票的字串二維陣列 from,to 子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從 jfk 甘迺迪國際機場 出發的先生,所以該行程必須從 jfk 出發。說明 如果存在多種有效的行程,你可以按字元自然排序返回最小的行程組合。例如,行程 j...