LeetCode —— 332. 重新安排行程(Python)

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。

说明:

  1. 如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前;
  2. 所有的机场都用三个大写字母表示(机场代码);
  3. 假定所有机票至少存在一种合理的行程;

示例 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)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值