给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例 1:
输入:tickets = [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]]
输出:[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]
示例 2:
输入:tickets = [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出:[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释:另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”] ,但是它字典排序更大更靠后。
提示:
1 <= tickets.length <= 300
tickets[i].length == 2
fromi.length == 3
toi.length == 3
fromi 和 toi 由大写英文字母组成
fromi != toi
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reconstruct-itinerary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最初使用图论的时候,pta是给出每个边,然后用数组建立边和边的关系大致就是
linjie[a][length[a]++]=b;
但是python教会我做人了
对于字符串这样的是没办法继续用传统数组了
今天发现一个好东西:字典的键值对
而且有了这东西,在字典里面对应链接的点直接做成了一个数组(我爱python)
d={} for a,b in tickets: d.setdefault(a,[]).append(b);
是的,用这三行就不用建图了hhh
解释一下,d是字典,setdefault(a,[])是在字典里面找a的值,如果能找到,就返回对应位置,找不到就建立新的索引,返回给定值(这里面是[]),但是这个返回值没啥用,只要能把图建立起来就行
而且python更强大的地方在于
对于
a={'a':1,'d':[2,3]}
这样的一个字典,a[‘d’]=[2,3];
在字典里面这个索引不再只是数字
这样的话就方便多了
以上只是对字典的介绍
下面来讨论一下这道题
这个题是一个连通图,要么有欧拉回路(能回到‘JFK’),要么有欧拉通路(回不到‘JFK’)在考虑仅有欧拉通路的情况下,‘JFK’连接的某一个点(只能存在一个点,并且整个图里面只能存在一个入度-出度=1的点)可能是一个死胡同,或者说死胡同不知道在哪个位置被搜索到,这个死胡同是指字典序在前边,还是个死胡同,引用官方题解,形如:
AAA排在BBB前边,先搜索AAA,提前进入死胡同导致出错
这样的话,可以这样来处理,将遍历完所有边的结点最后放到结果数组里面,然后把结果数组逆序返回
这样的好处是如果AAA先遍历完成,那他就可以先入栈,最后将数组逆序的时候,AAA就在前面了
例题:
考虑这个连通图:
进行模拟堆栈演示
(画图技术不佳,敬请谅解)
就是之所以会出现AA在最后这个现象,是因为,最先访问的如BBB(按照字母顺序)是没有解栈的(释放栈)而AA由于先访问完了,所以解栈,由于这样的死胡同只有一个,不必过多考虑,所以这样的元素应该放在后面
放个代码:
class Solution: def __init__(self): self.result=[]; def dfs(self,jiedian,d): if(jiedian in d): while(len(d[jiedian])!=0): self.dfs(d[jiedian].pop(0),d); self.result.append(jiedian) def findItinerary(self, tickets ) : d={}; for a,b in tickets: d.setdefault(a,[]).append(b); for i in d: d[i]=sorted(d[i]) self.dfs("JFK",d) return self.result[::-1]