1. 題目
給定一個機票的字元串二維數組 [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"]。
但是它自然排序更大更靠後。
複制
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reconstruct-itinerary
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
可以看看:
了解一下數學中的歐拉路徑,你就能成為一筆畫小遊戲的大神
歐拉路徑與歐拉回路
歐拉回路的充要條件
無向圖:所有點的度數都為偶數
有向圖:所有點的入度==出度
歐拉路徑的充要條件
無向圖:除兩點(起點與終點)外其餘點的度數都為偶數
有向圖:除兩點(起點 入度+1=出度,終點 入度−1=出度)外,其餘點的 入度==出度
- 以下代碼的思路如上圖
- 按照題意,對起點連接配接的點存在
(有序)中,從begin開始multiset
- 不斷的遞歸,遞歸前,删除邊
- 當邊的個數為0時,再把節點添加到答案中
- 最後答案逆序就是歐拉路徑
class Solution {
unordered_map<string, multiset<string>> m;
vector<string> ans;
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
for(auto& t : tickets)
m[t[0]].insert(t[1]);
dfs("JFK");
reverse(ans.begin(),ans.end());
return ans;
}
void dfs(string s)
{
while(m[s].size() != 0)
{
string to = *m[s].begin();
m[s].erase(m[s].begin());
dfs(to);
}
ans.push_back(s);
}
};
複制
52 ms 14 MB