Google, Yelp高频面试题 | Reconstruct Itinerary



Reconstruct Itinerary,是Google、yelp等公司的高频面试题。


本期习题讲解,我们就通过这道题目,介绍如何将具体的问题抽象成为一个图遍历问题求解。



  先一起来看看题目:


题目描述


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:


  1. 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"].


  2. All airports are represented by three capital letters (IATA code).


  3. You may assume all tickets form at least one valid itinerary.


Input/Output:


List<String> findItinerary(String[][] tickets)


Example:


tickets = ["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]


Return ["JFK","ATL","JFK","SFO","ATL","SFO"].


Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]. But it is larger in lexical order.



考点解析


Reconstruct Itinerary是一道Google, Yelp等公司常考的面经题。乍一看不好解决,但稍微分析一下不难发现,这道题目的本质就是考察有向图的遍历。


我们需要不断的练习和提高自己的抽象能力,将实际问题转化成常见的算法问题来解决。作为一个工程师,我们平时真正要解决的都是这类实际问题,而现在各大公司面试中也会着重考察透过现象看本质的能力。


今天的习题讲解,我们就通过这道题目讲解一下如何对一个有向图进行边遍历。并且,讲解欧拉路径,及求解欧拉路径的相关算法。



主讲人:Jack Sun老师

FLGU一线公司资深工程师





点击上方播放键观看

或扫描下方二维码

进入来Offer官网观看



解题思路


在这道题目中,Jack Sun老师讲解了两个不同的解法,一个是Brute Force的解法,另一个是利用欧拉路径的概念实现的更加优化的算法。


Brute Force解法


这道题目是一个比较具体的问题,我们可以将它转化成一个图来描述。图中每一个点就是一个地点,每张票代表的就是两个地点之间的连线,也就是一个有向的边。


如下面的例子所示:


input [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]



这个题目一个最直接的想法就是从起点JFK开始,尝试所有可能的路径,并返回第一个用完全部ticket的路径。


具体来说分为以下几步完成:


  • 把input由票的形式转换成为图的形式,给定一个点,就能快速地知道它所连接的邻居点们,并且以lexical order的顺序的访问它们


  • 在这里一个intuitive的数据结构就是:HashMap<String, List<String>>


  • 在构造的图上从JFK开始做DFS,访问所有能走的路,同时remove掉访问过的边,如果走到一个地方走不通了,我们再利用backtrack回去


那么对于这个例子来说,我们最终找到的就是:


Eulerian Path 欧拉路径


这道题目实际上有一个更好的解法,就是欧拉路径。



欧拉路径

In graph theory, an Eulerian trail (or Eulerian path) is a trail in a finite graph which visits every edge exactly once.


这个和这个题目的要求,每个票只用一次,并且全部要用到,是完全符合的。


那么,这个题目就可以转化成:已知图中存在欧拉路径,如何找到一个欧拉路径?


今天我们着重讲解一下求欧拉路径的一个经典算法:Hierholzer


我们看一下Hierholzer算法的伪代码:



那么将这个算法应用到这道题目中,我们只需要在构造好图以后,从JFK开始做DFS,最后将path返回就可以了。


这道题目与经典的hierholzer算法唯一不同的地方是,我们要优先访问 lexical order比较小的点。



代码实现



算法与代码中需要注意的细节处理及时间、空间复杂度分析请观看视频讲解。



E/N/D


更多科技求职资讯,请关注“来Offer”

Reconstruct Itinerary,是Google、yelp等公司的高频面试题。


本期习题讲解,我们就通过这道题目,介绍如何将具体的问题抽象成为一个图遍历问题求解。



  先一起来看看题目:


题目描述


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:


  1. 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"].


  2. All airports are represented by three capital letters (IATA code).


  3. You may assume all tickets form at least one valid itinerary.


Input/Output:


List<String> findItinerary(String[][] tickets)


Example:


tickets = ["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]


Return ["JFK","ATL","JFK","SFO","ATL","SFO"].


Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]. But it is larger in lexical order.



考点解析


Reconstruct Itinerary是一道Google, Yelp等公司常考的面经题。乍一看不好解决,但稍微分析一下不难发现,这道题目的本质就是考察有向图的遍历。


我们需要不断的练习和提高自己的抽象能力,将实际问题转化成常见的算法问题来解决。作为一个工程师,我们平时真正要解决的都是这类实际问题,而现在各大公司面试中也会着重考察透过现象看本质的能力。


今天的习题讲解,我们就通过这道题目讲解一下如何对一个有向图进行边遍历。并且,讲解欧拉路径,及求解欧拉路径的相关算法。



主讲人:Jack Sun老师

FLGU一线公司资深工程师





点击上方播放键观看

或扫描下方二维码

进入来Offer官网观看



解题思路


在这道题目中,Jack Sun老师讲解了两个不同的解法,一个是Brute Force的解法,另一个是利用欧拉路径的概念实现的更加优化的算法。


Brute Force解法


这道题目是一个比较具体的问题,我们可以将它转化成一个图来描述。图中每一个点就是一个地点,每张票代表的就是两个地点之间的连线,也就是一个有向的边。


如下面的例子所示:


input [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]



这个题目一个最直接的想法就是从起点JFK开始,尝试所有可能的路径,并返回第一个用完全部ticket的路径。


具体来说分为以下几步完成:


  • 把input由票的形式转换成为图的形式,给定一个点,就能快速地知道它所连接的邻居点们,并且以lexical order的顺序的访问它们


  • 在这里一个intuitive的数据结构就是:HashMap<String, List<String>>


  • 在构造的图上从JFK开始做DFS,访问所有能走的路,同时remove掉访问过的边,如果走到一个地方走不通了,我们再利用backtrack回去


那么对于这个例子来说,我们最终找到的就是:


Eulerian Path 欧拉路径


这道题目实际上有一个更好的解法,就是欧拉路径。



欧拉路径

In graph theory, an Eulerian trail (or Eulerian path) is a trail in a finite graph which visits every edge exactly once.


这个和这个题目的要求,每个票只用一次,并且全部要用到,是完全符合的。


那么,这个题目就可以转化成:已知图中存在欧拉路径,如何找到一个欧拉路径?


今天我们着重讲解一下求欧拉路径的一个经典算法:Hierholzer


我们看一下Hierholzer算法的伪代码:



那么将这个算法应用到这道题目中,我们只需要在构造好图以后,从JFK开始做DFS,最后将path返回就可以了。


这道题目与经典的hierholzer算法唯一不同的地方是,我们要优先访问 lexical order比较小的点。



代码实现



算法与代码中需要注意的细节处理及时间、空间复杂度分析请观看视频讲解。



E/N/D

猜你喜欢

转载自blog.csdn.net/laioffer/article/details/80603434