邻接表+递归
我的思路:
在python中要引入import collections
步骤:
1先将图存入邻接表
2将邻接表中的元素进行排序
3依次按键取出值,在将值作为下一次的键进行递归,
4最后将遍历过的值从后往前依次加入到列表里
核心思想–深度搜索+回溯
大佬思路:
# 首先先把图的邻接表存进字典,然后对字典的value进行排序
# 然后从’JFK’开始深搜,每前进一层就减去一条路径,
# 直到某个节点不存通往其他节点的路径时,说明该节点就为此次行程的终点
# 需要跳出while循环进行回溯,返回到上一层节点进行搜索,再次找到倒数第二个终点,依次类推
# 设定ans为返回答案,每次找到的节点都要往头部插入
# 举例说明:[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
# 构建领接表的字典:{'JFK': ['SFO', 'ATL'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']})
# 按照题目要求对字典的val排序:{'JFK': ['ATL', 'SFO'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']})
# 开始从 JFL 开始进行dfs搜索
# 1.JFK --> ALT
# JFK pop出ALT,JFK的字典变为:'JFK': ['SFO']
# 2.JFK --> ALT --> JFK
# ALT pop出JFK,ALT的字典变为:'ALT': ['SFO']
# 3.JFK --> ALT --> JFK --> SFO
# JFK pop出SFO,JFK的字典变为:'JFK': ['']
# 4.JFK --> ALT --> JFK --> SFO --> ATL
# SFO pop出ALT,SFO的字典变为:'SFO': ['']
# 5.JFK --> ALT --> JFK --> SFO --> ATL --> SFO
# ATL pop出SFO,ATL的字典变为:'ATL': ['']
# 此时我们可以发现SFO的val为空,没有地方可以去了,说明我们已经找出了终点SFO
# 然后向上回溯,依次将其添加到ans中
# 最终答案为:["JFK","ATL","JFK","SFO","ATL","SFO"]
参考链接:https://leetcode-cn.com/problems/reconstruct-itinerary/solution/332-zhong-xin-an-pai-xing-cheng-chao-xiang-xi-ti-j/
class Solution:
def findItinerary(self, tickets: List[List[str]]) -> List[str]:
# 方法一:建立邻接表
list_lin = collections.defaultdict(list)
for i, j in tickets:
list_lin[i] += [j]
# 对邻接表中元素进行排序
for key in list_lin:
list_lin[key].sort()
# 递归计算路径
res = []
def dfs(val):
while list_lin[val]:
dfs(list_lin[val].pop(0))
res.insert(0, val)
dfs('JFK')
return res