332 重新安排行程

2021-10-24 19:40:16 字數 1730 閱讀 9182

給定乙個機票的字串二維陣列 [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"]。但是它自然排序更大更靠後。

分析:這是乙個尤拉路徑問題,

既然要求字典序最小,那麼我們每次應該貪心地選擇當前節點所連的節點中字典序最小的那乙個,並將其入棧。最後棧中就儲存了我們遍歷的順序。

為了保證我們能夠快速找到當前節點所連的節點中字典序最小的那乙個,我們可以使用優先佇列儲存當前節點所連到的點,每次我們 o(1)o(1) 地找到最小字典序的節點,並 o(\log m)o(logm) 地刪除它。

注意:如果使用貪心進入字典序比較小的,容易進入死胡同,當碰到出度與入度差為1時,則是死胡同

解法:

hierholzer

演算法思路:

hierholzer 演算法用於在連通圖中尋找尤拉路徑,其流程如下:

從起點出發,進行深度優先搜尋。

每次沿著某條邊從某個頂點移動到另外乙個頂點的時候,都需要刪除這條邊。

如果沒有可移動的路徑,則將所在節點加入到棧中,並返回。

我們注意到只有那個入度與出度差為 11 的節點會導致死胡同。而該節點必然是最後乙個遍歷到的節點。我們可以改變入棧的規則,當我們遍歷完乙個節點所連的所有節點後,我們才將該節點入棧(即逆序入棧)。

對於當前節點而言,從它的每乙個非「死胡同」分支出發進行深度優先搜尋,都將會搜回到當前節點。而從它的「死胡同」分支出發進行深度優先搜尋將不會搜回到當前節點。也就是說當前節點的死胡同分支將會優先於其他非「死胡同」分支入棧。

class solution 

map.get(src).offer(dst);

}dfs("jfk");

collections.reverse(itinerary);

return itinerary;

}public void dfs(string curr)

itinerary.add(curr);

}}//********************方法二

使用了map.computeifabsent(key,function)

for(listticket : tickets)

332 重新安排行程

給定乙個機票的字串二維陣列 from,to 子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從jfk 甘迺迪國際機場 出發的先生,所以該行程必須從 jfk 出發。說明 如果存在多種有效的行程,你可以按字元自然排序返回最小的行程組合。例如,行程 jf...

332 重新安排行程

題目描述 如果存在多種有效的行程,請你按字元自然排序返回最小的行程組合。例如,行程 jfk lga 與 jfk lgb 相比就更小,排序更靠前 所有的機場都用三個大寫字母表示 機場 假定所有機票至少存在一種合理的行程。所有的機票必須都用一次 且 只能用一次。示例 1 輸入 muc lhr jfk m...

Leetcode 332 重新安排行程

給定乙個機票的字串二維陣列 from,to 子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於乙個從 jfk 甘迺迪國際機場 出發的先生,所以該行程必須從 jfk 出發。說明 如果存在多種有效的行程,你可以按字元自然排序返回最小的行程組合。例如,行程 j...