专栏 | 九章算法
网址 | www.jiuzhang.com
题目描述
某次旅行后小九留下了若干张飞机票,每张飞机票上写有出发和到达的机场名。他出发的机场是“JFK”,他希望知道自己旅行时的准确路线。
数据保证有解。当有多组解时输出字典序最小的一组。
Example 1:
tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Return ["JFK", "MUC", "LHR", "SFO", "SJC"].
Example 2:
tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Return ["JFK","ATL","JFK","SFO","ATL","SFO"].
分析解答
根据题目要求,一种贪心加深度优先搜索的方法是:从JFK机场出发,每次都选择一个可以到达的且字典序最小的机场,进行下一步的搜索。搜索的终止条件为所有的飞机票都使用完毕。这种暴力搜索算法理论上是可行的,但时间复杂度是指数级别的。
此题有一种更好的做法,把机场想象成点,飞机票想象成有向边,问题就转化成了在一个有向图中求一条经过所有边的路径。求欧拉路径有一种O(M)(M为边数)的Fleury算法:首先深度优先搜索遍历整个图,标记已经遍历过的边不再遍历;当一个点无法再经过未遍历的边到达其他点时把该点加入栈中;最后把栈中序列输出得到欧拉路径。
简单证明如下:首先定义割边,去掉该边原图不连通则该边为割边;在搜索欧拉路径的过程中一旦遇到割边就意味着当前的搜索路径需要改进,即提前经过其他某一联通子图内的边。回溯添加节点的方法可以保证割边一定最先加入栈,也就是出现在欧拉路径的最后,因此可以通过一次深度优先搜索得到完整的欧拉路径。
参考代码

面试官角度分析
本题使用的最优算法求图欧拉路径算法是图论中的经典算法。但是对于普通求职者来说,要求此算法在面试中解出是不合理的。这个题对于大部分人来说,只需要做出暴力dfs的算法就可以拿到hire了。做出欧拉路径的做法自然是strong hire。但是如果你没有太多时间,建议不要花太多时间学习该算法。介于此题是来自Google,因此根据笔者经验,一般只给简历上有竞赛经历的人来进行面试。
LintCode 相关练习
推荐阅读
- 12 个 tips 教你搞定 onsite!
- 25 个 questions, 教你向面试官提问!
- 10 个 tips 教你搞定电面!
- 北美IT企业fulltime薪资大曝光
- IT 简历模板大放送 | 《如何写好技术简历》讲座精华总结
- 面试遇到做过的题怎么办?
- 冷冻期大揭秘 | Google、FB、Amazon、Linkedin冷冻期
- 面试前如何了解一家IT企业?试试官方技术博客!
- Google晋升机制 | 大公司如何升级打怪, 获得晋升?
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
