用 C++ 重构行程
假设我们有一张航空机票列表,用出发机场和到达机场对表示,例如[出发地,目的地],我们必须按顺序重构行程。所有机票都属于一位从 JFK 出发的男士。因此,行程必须以 JFK 开始。
所以,如果输入类似于[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]],那么输出将是["JFK", "MUC", "LHR", "SFO", "SJC"]。
为了解决这个问题,我们将遵循以下步骤:
定义数组 ret 和一个名为 graph 的映射。
定义一个名为 visit 的方法。这将以机场名称作为输入。
当 graph[机场] 的大小不为 0 时
x := graph[机场] 的第一个元素
从 graph[机场] 中删除第一个元素
调用 visit(x)
将机场插入 ret
现在,从主方法开始,执行以下操作:
对于 i 在 0 到 tickers 数组大小的范围内
u := tickets[i, 0],v := tickets[i, 1],将 v 插入 graph[u]
访问“JFK”,因为这是第一个机场
反转列表 ret 并返回
示例 (C++)
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector <string> ret;
map < string, multiset <string> > graph;
vector<string> findItinerary(vector<vector<string>>& tickets) {
for(int i = 0; i < tickets.size(); i++){
string u = tickets[i][0];
string v = tickets[i][1];
graph[u].insert(v);
}
visit("JFK");
reverse(ret.begin(), ret.end());
return ret;
}
void visit(string airport){
while(graph[airport].size()){
string x = *(graph[airport].begin());
graph[airport].erase(graph[airport].begin());
visit(x);
}
ret.push_back(airport);
}
};
main(){
Solution ob;
vector<vector<string>> v = {{"MUC","LHR"},{"JFK","MUC"},{"SFO","SJC"},{"LHR","SFO"}};
print_vector(ob.findItinerary(v));
}输入
[["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]]
输出
[JFK, MUC, LHR, SFO, SJC, ]
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP