我正在解决一个关于Leetcode的问题:
https://leetcode.com/problems/reconstruct-itinerary/description/
. 问题是:
Given a list of airline tickets represented by pairs of departure and
arrival airports [from, to], reconstruct the itinerary in order. All of
the tickets belong to a man who departs from JFK. Thus, the itinerary
must begin with JFK.
例如,如果
tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
,输出应为:
["JFK", "MUC", "LHR", "SFO", "SJC"]
.
我编写了以下代码,这(可以理解)破坏了输入
[["JFK","KUL"],["JFK","NRT"],["NRT","JFK"]]
,因为根据我的代码,节点“NRT”保持未访问状态:
class Solution {
public:
vector<string> findItinerary(vector<pair<string, string>> tickets) {
if(tickets.empty()) return vector<string>();
vector<string> result;
unordered_map<string, multiset<string>> itinerary;
for(auto& each : tickets)
itinerary[each.first].insert(each.second);
stack<string> myStack;
myStack.push("JFK");
while(!myStack.empty()) {
string topVal=myStack.top();
result.push_back(topVal);
myStack.pop();
if(!itinerary[topVal].empty()) {
myStack.push(*itinerary[topVal].begin());
itinerary[topVal].erase(itinerary[topVal].begin());
}
}
return result;
}
};
为了克服这一问题,其中一个经过投票的解决方案提出了以下小变化:
class Solution {
public:
vector<string> findItinerary(vector<pair<string, string>> tickets) {
if(tickets.empty()) return vector<string>();
vector<string> result;
unordered_map<string, multiset<string>> itinerary;
for(auto& each : tickets)
itinerary[each.first].insert(each.second);
stack<string> myStack;
myStack.push("JFK");
while(!myStack.empty()) {
string topVal=myStack.top();
if(itinerary[topVal].empty()) { //--->this if condition
result.push_back(topVal);
myStack.pop();
}
else {
myStack.push(*itinerary[topVal].begin());
itinerary[topVal].erase(itinerary[topVal].begin());
}
}
reverse(result.begin(), result.end());
return result;
}
};
现在,我用这个示例编写了这段代码
[[“JFK”、“KUL”]、[“JFK”、“NRT”]、[“NRT”、“JFK”]]
,并查看它如何将值插入
result
反向矢量;但我不明白
直觉
在该if条件之后:
只有当集合为空时才从堆栈弹出,如何确保该测试用例得到处理?