提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目分析
这题在LeetCode上标签为深搜和图,所以首先往这两个方面考虑,那么第一步就是构建一个字典来表示这个图。
题目要求如果存在多种有效行程按照字典排序,所以第二步就是对字典对应的列表进行排序。
接下来就是DFS的步骤了,对于DFS我们发现本题为有向图我们可以用上Hierholzer 算法来进行遍历得到一个栈最后把栈倒序输出即可得出答案
二、具体步骤
1.构建图
代码如下:
targets=defaultdict(list)
for target in tickets:
targets[target[0]].append(target[1])
这里用到了python的defaultdict提前定义字典定义的映射类型
2.排序
代码如下:
for key in targets:
targets[key].sort()
3.DFS
代码如下
def DFS(self,node,path):
# path[node]暂时能去的点
# path[node].pop(0)删除路径
while path[node]:#当数组里面没有东西说明无路可走到头了
self.DFS(path[node].pop(0),path)
self.ans.append(node)
while条件为path[node]即字典中该节点无对应的路径后结束循环
从"JFK"开始遍历,遍历之后把经过的边删除,由于有了排序的步骤,所以这里遍历默认第一个就是最小路径。
DFS往下遍历,遍历到尾节点循环结束,节点入栈
以此类推重复这个回溯过程,DFS结束之后就会得到
[‘SJC’, ‘SFO’, ‘LHR’, ‘MUC’, ‘JFK’]
最后return ans[::-1]即可得出结果
4.完整代码
(仅供参考,欢迎指正学习)
class Solution(object):
def findItinerary(self, tickets):
"""
:type tickets: List[List[str]]
:rtype: List[str]
"""
targets=defaultdict(list)
for target in tickets:
targets[target[0]].append(target[1])
for key in targets:
targets[key].sort()
self.ans=[]
self.DFS("JFK",targets)
return self.ans[::-1]
def DFS(self,node,path):
while path[node]:
self.DFS(path[node].pop(0),path)
self.ans.append(node)