332. 重新安排行程

该文章讨论了一个使用递归和回溯算法解决的编程问题,涉及在给定航班票据的情况下找到一条按字典序最小的旅行路径。关键在于递归函数的返回逻辑,它在满足条件时直接返回结果,避免保存所有路径。算法首先对所有可能的出发机场进行排序,然后通过递归遍历寻找有效的行程。当找不到合适路径时,算法会回退并尝试其他选择,直到找到一条满足条件的路径。
摘要由CSDN通过智能技术生成

2023.6.28
这题确实挺难的
其他的都还好,关键在于递归函数return的内容,前面回溯算法中,只在终止条件中进行了return,本题在递归逻辑中也有return,旨在找到一条路径直接返还,保证题目要求中的(如果存在多种有效的行程,请你按字典排序返回最小的行程组合。)因此本题不能够将所有有效路径保存在result中一股脑进行返还。
这个递归的逻辑还是很妙的,当path数量不够,但从当前机场出发已经没有票了,就不会进入for循环,递归函数直接返还False,那么对于上层递归而言if self.backtracking():语句内的内容不会执行,于是函数向下执行,把当前机场抛出并恢复用过的机票。
只要没有出现上述情况,递归函数会不断通过if self.backtracking():语句开始递归嵌套,如果遇到上述情况就会回退,然后在遍历本层的下一个机场,当本层已经遍历完了仍然没有找到合适的路径,那么会在for循环后返还一个False,回到上一层的机场。
当if len(self.path) == self.n + 1:语句触发,递归得到一个True后就会逐层返还得到的True,结束整个递归过程,这就意味着一旦找到合适的路径就会直接结束整个递归

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        self.targets = collections.defaultdict(list)
        self.n = len(tickets)  # 总共有几张票
        for ticket in tickets:
            self.targets[ticket[0]].append(ticket[1])
        # key是str记录了出发机场
        # val是[str]记录了该出发机场能够抵达的目的地
        for airport in self.targets:
            self.targets[airport].sort()  # 排序
        self.path = ['JFK']  # 起点
        self.backtracking()
        return self.path
    
    def backtracking(self):
        if len(self.path) == self.n + 1:
            return True
        
        airport = self.path[-1]  # 当前所在机场

        for i, dest in enumerate(self.targets[airport]):
            self.targets[airport].pop(i)  # 这张已经用过了
            self.path.append(dest)
            if self.backtracking():
                return True
            self.path.pop()
            self.targets[airport].insert(i, dest)
        return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值