LeetCode 332. 重新安排行程(歐拉回路)
阿新 • • 發佈:2021-02-05
技術標籤:# leetcode# 歐拉回路
給定一個機票的字串二維陣列 [from, to],子陣列中的兩個成員分別表示飛機出發和降落的機場地點,對該行程進行重新規劃排序。所有這些機票都屬於一個從 JFK(肯尼迪國際機場)出發的先生,所以該行程必須從 JFK 開始。
提示:
如果存在多種有效的行程,請你按字元自然排序返回最小的行程組合。例如,行程 [“JFK”, “LGA”] 與 [“JFK”, “LGB”] 相比就更小,排序更靠前
所有的機場都用三個大寫字母表示(機場程式碼)。
假定所有機票至少存在一種合理的行程。
所有的機票必須都用一次 且 只能用一次。
示例 1:
輸入:[[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]]
示例 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;
}
};