给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。
说明:
- 如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前;
- 所有的机场都用三个大写字母表示(机场代码);
- 假定所有机票至少存在一种合理的行程;
示例 1:
输入: [[“MUC”, “LHR”], [“JFK”, “MUC”], [“SFO”, “SJC”], [“LHR”, “SFO”]]
输出: [“JFK”, “MUC”, “LHR”, “SFO”, “SJC”]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reconstruct-itinerary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————
使用递归和回溯,递归停止条件是存储路径的节点数为路径的长度+1,如果当前节点没有下一个可达路径,但同时不符合递归停止条件,则进行回溯。
from collections import defaultdict
class Solution:
def __init__(self):
self.path = ['JFK']
def findItinerary(self, tickets):
ticket_dict = defaultdict(list) # 字典,value为list
for item in tickets: # 计算每个节点的可达目的地
ticket_dict[item[0]].append(item[1])
def backtrack(cur_from):
if len(self.path) == len(tickets) + 1: # 结束条件
return True
ticket_dict[cur_from].sort()
for _ in ticket_dict[cur_from]:
cur_to = ticket_dict[cur_from].pop(0) # 删除当前节点
self.path.append(cur_to) # 做选择
if backtrack(cur_to): # 进入下一层决策树
return True
self.path.pop() # 取消选择
ticket_dict[cur_from].append(cur_to) # 恢复当前节点
return False
backtrack('JFK')
return self.path
递归的时间复杂度为O(m),排序的时间复杂度为O(mlogm),所以总体时间复杂度为O(mlogm),空间复杂度为O(n)。