LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)
题目:
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
.
Note:
- If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string. For example, the itinerary
["JFK", "LGA"]
has a smaller lexical order than["JFK", "LGB"]
. - All airports are represented by three capital letters (IATA code).
- You may assume all tickets form at least one valid itinerary.
Example 1:
Input:
[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Output:["JFK", "MUC", "LHR", "SFO", "SJC"]
Example 2:
Input:
[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Output:["JFK","ATL","JFK","SFO","ATL","SFO"]
Explanation: Another possible reconstruction is["JFK","SFO","ATL","JFK","ATL","SFO"]
.
But it is larger in lexical order.
分析:
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 出发。
可以将题目理解为一个有向图,飞机票当成图的边,最后求的是结点的顺序,实际上是求一个欧拉回路。
这里我们使用Hierholzer算法求解此问题。
正常来说我们应该先求出度为奇数的点,不过由于这道题告知要从“JFK”开始,所以我们可以直接从JFK开始搜索。
DFS(u):
while(u存在未被访问过的边e(u, v))
标记边e(u, v)已被访问
DFS(v)
END
将点u添加到路径集中
还是以上面的为例,从JFK开始,存在未被访问的边(1,3),我们在这个选择3,也就是通往SFO的边(注意此题要求应该是选择字符排序小的点,这里只是模拟一下求解欧拉回路的过程),然后我们将3这条边标记以访问。
然后从SFO开始,存在为被访问的边(4),我们选择4这条边,到达了ATL这个点,同样的4也被标记访问过了。
ATL存在未被访问的边(5,2),我们选择5这条边,到达了SFO这个点,5也被标记访问过。
SFO已经不存在未被访问的边了(4已经被标记访问过了),所以我们将SFO加入到路径集中[SFO],并返回上次访问的点。
此时ATL中还存在2这条边未被访问,我们选择2这条边,到达了JFK这个点,2也标记访问过。
JFK中1还未访问,我们选择1这条边,到达了ATL这个点,注意此时所有的边都已经访问过了,ATL没有边可以继续访问了,我们将ATL加入路径集[SFO,ATL],返回上次访问的点。
此时JFK也没有边访问了,我们将JFK加入[SFO,ATL,JFK]
同理ATL也没有可访问的边了,将ATL加入[SFO,ATL,JFK,ATL]
返回到SFO,也没有边可以访问了,将SFO加入[SFO,ATL,JFK,ATL,SFO]
最后我们回到了出发点JFK,1,3都已被标记访问过,将JFK加入到路径集中得[SFO,ATL,JFK,ATL,SFO,JFK],最后将结果集中数据反转一下即可得到所求得欧拉路径。也就是JFK->SFO->ATL->JFK->ATL->SFO
不过注意由于题中要求字符自然排序最小,所以我们在选择边时,要按照顺序选在下一个访问的结点。例如从JFK开始有通向SFO和ATL两个边,我们选择通往ATL的边,依照这样的规则我们可以得到结果
["JFK","ATL","JFK","SFO","ATL","SFO"]
小技巧:在保存机票起点和终点时,我们可以使用有限队列存储边,优先访问字符小的边。
程序:
C++
class Solution {
public:
vector<string> findItinerary(vector<vector<string>>& tickets) {
for(int i = 0; i < tickets.size(); ++i){
if(map.find(tickets[i][0]) == map.end()){
priority_queue <string, vector<string>, cmp> q;
q.push(tickets[i][1]);
map[tickets[i][0]] = q;
}
else{
map[tickets[i][0]].push(tickets[i][1]);
}
}
findPath("JFK");
reverse(res.begin(), res.end());
return res;
}
void findPath(string begin){
while(map.find(begin) != map.end() && map[begin].size() != 0){
string next = map[begin].top();
map[begin].pop();
findPath(next);
}
res.push_back(begin);
}
private:
struct cmp
{
bool operator() (string a, string b)
{
return a > b;
}
};
vector<string> res;
unordered_map<string, priority_queue <string, vector<string>, cmp>> map;
};
Java
class Solution {
public List<String> findItinerary(List<List<String>> tickets) {
for(List<String> pair:tickets){
String key = pair.get(0);
String value = pair.get(1);
if(!map.containsKey(key)){
PriorityQueue<String> p = new PriorityQueue<>();
p.add(value);
map.put(key, p);
}
else{
map.get(key).add(value);
}
}
getPath("JFK");
return res;
}
private void getPath(String begin){
while(map.containsKey(begin) && map.get(begin).size() != 0){
getPath(map.get(begin).poll());
}
res.add(0, begin);
}
private List<String> res = new ArrayList<>();
private Map<String, PriorityQueue<String>> map = new HashMap<>();
}
LeetCode 332. Reconstruct Itinerary重新安排行程 (C++/Java)的更多相关文章
- [leetcode]332. Reconstruct Itinerary
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- 【LeetCode】332. Reconstruct Itinerary 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 后序遍历 相似题目 参考资料 日期 题目地址:htt ...
- 【LeetCode】Reconstruct Itinerary(332)
1. Description Given a list of airline tickets represented by pairs of departure and arrival airport ...
- 【LeetCode】332. Reconstruct Itinerary
题目: Given a list of airline tickets represented by pairs of departure and arrival airports [from, to ...
- 332. Reconstruct Itinerary (leetcode)
1. build the graph and then dfs -- graph <String, List<String>>, (the value is sorted a ...
- 332 Reconstruct Itinerary 重建行程单
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- 332. Reconstruct Itinerary
class Solution { public: vector<string> path; unordered_map<string, multiset<string>& ...
- Java实现 LeetCode 332 重新安排行程
332. 重新安排行程 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从JFK(肯尼迪国际机场 ...
- Leetcode 332.重新安排行程
重新安排行程 给定一个机票的字符串二维数组[from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序.所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生 ...
- [Swift]LeetCode332. 重新安排行程 | Reconstruct Itinerary
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
随机推荐
- 还原数据库从远端环境到本地开发环境,数据SINGLE_USER问题
要还原到本地开发环境,首先要detach本地数据库或者是删除本地数据库,不然提示在使用中还原不了,但是搞过几次去做detach和drop数据库时,总是不成功,最后还出现个单用户模式,莫名奇妙 为此网上 ...
- 力扣423(java)-从英文中重建数字(中等)
题目: 给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9).按 升序 返回原始的数字. 示例 1: 输入:s = "owoztneoer"输出:&quo ...
- EMQX + PolarDB-X 一站式 IoT 数据解决方案
简介: 本文整理自 EMQX 产品经理李国伟,在PolarDB开源社区中关于EMQX与PolarDB-X构建一站式IoT数据解决方案的分享.本篇内容主要分为四个部分:1. IoT数据特性 2. EMQ ...
- MaxCompute项目子账号做超级管理员
场景 主账号不是大数据团队管理,使用MaxCompute员工都只持有子账号,而project的owner只能为主账号,但是很多MaxCompute的权限管理还需要owner才可以操作(如项目级别的fl ...
- 5月25日,阿里云开源 PolarDB-X 将迎来重磅升级发布
简介:2022年5月25日,阿里云开源 PolarDB-X 将升级发布新版本!PolarDB-X 从 2009 年开始服务于阿里巴巴电商核心系统, 2015 年开始对外提供商业化服务,并于 2021 ...
- 如何使用 Serverless Devs 部署静态网站到函数计算(上)
简介:部署个静态网站到函数计算~ 前言 公司经常有一些网站需要发布上线,对比了几款不同的产品后,决定使用阿里云的函数计算(FC)来托管构建出来的静态网站. FC 弹性实例自带的500 Mb 存储空 ...
- RocketMQ 端云一体化设计与实践
简介:本文首先介绍了端云消息场景一体化的背景,然后重点分析了终端消息场景特点,以及终端消息场景支撑模型,最后对架构和存储内核进行了阐述.我们期望基于 RocketMQ 统一内核一体化支持终端和服务端不 ...
- Duang,您的钉钉应用已上线!云开发5分钟快速打造钉钉会议室预定系统
简介: 5分钟可以干什么?喝一杯咖啡,回一封邮件,还是开发上线一个钉钉应用.云开发平台联合钉钉开发平台推出0门槛打造你的第一个钉钉应用的活动,完成相应任务后,即可领取精美奖品.春暖花开,领个背包去踏春 ...
- 运营也用的起来的数据分析工具:Quick BI即席分析详解
简介: 数据部门是一个容易被投诉的"高危"部门,需求响应慢.数据准确性不高会影响业务的发展. 然而数据分析师每周动辄就有几十个需求在手,无限的加班也无法解决所有问题,到底怎样才能 ...
- [FAQ] Sortable 拖拽组件, 火狐浏览器中打开新窗口问题
Q:用了 sortable 组件,在火狐浏览器中进行拖拽时,会打开新窗口 ? Sortable组件地址,https://github.com/SortableJS/Sortable 当前处理方式 ...