1. 程式人生 > 其它 >LeetCode 332. 重新安排行程(歐拉回路)

LeetCode 332. 重新安排行程(歐拉回路)

技術標籤:# leetcode# 歐拉回路

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

思路:
按照標程寫的,可以看到有很多C++特性,如使用 m o v e move move函式將引數轉換為右值引用。在 m a p map map

中巢狀一個優先佇列,這樣省掉了對字串的編號以及排序過程。

class Solution {
public:
    unordered_map<string,priority_queue<string,vector<string>,greater<string>>>vec;
    vector<string>stk;
    void euler(const string&curr) {
        while(vec.count(curr) && vec[curr].size() > 0) {
            string tmp =
vec[curr].top(); vec[curr].pop(); euler(move(tmp)); } stk.push_back(curr); } vector<string> findItinerary(vector<vector<string>>& tickets) { for(auto&it:tickets) { vec[it[0]].emplace(it[1]); } euler("JFK"); reverse(stk.begin(),stk.end()); return stk; } };

自己寫的程式碼,效率不高

unordered_map<int,string>rev;
int cmp(pair<int,int> x,pair<int,int> y) {
    return rev[x.first] < rev[y.first];
}
class Solution {
public:
    unordered_map<string,int>mp;
    int cnt = 0;
    int head[10005],nex[10005],to[10005],tot = 0;
    int vis[10005];
    vector<string>ans;
    void add(int x,int y) {
        to[++tot] = y;
        nex[tot] = head[x];
        head[x] = tot;
    }
    
    void euler(int x) {
        vector<pair<int,int> >vec;
        for(int i = head[x];i;i = nex[i]) {
            int v = to[i];
            if(vis[i]) {
                continue;
            }
            vec.push_back({v,i});
        }
        sort(vec.begin(),vec.end(),cmp);
        for(int i = 0;i < vec.size();i++) {
            if(vis[vec[i].second]) continue;
            vis[vec[i].second] = 1;
            euler(vec[i].first);
            ans.push_back(rev[vec[i].first]);
        }
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        mp["JFK"] = 1;
        rev[1] = "JFK";
        cnt = 1;
        for(int i = 0;i < tickets.size();i++) {
            string s1 = tickets[i][0],s2 = tickets[i][1];
            if(!mp[s1]) {
                mp[s1] = ++cnt;
                rev[cnt] = s1;
            }
            if(!mp[s2]) {
                mp[s2] = ++cnt;
                rev[cnt] = s2;
            }
            add(mp[s1],mp[s2]);
        }
        euler(1);
        ans.push_back(rev[1]);
        reverse(ans.begin(),ans.end());
        return ans;
    }
};