332 重新安排行程

2021-10-02 11:19:18 字數 1658 閱讀 4405

給定乙個機票的字串二維陣列[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...