LeetCode332重新安排行程(Python)

本文详细解析了LeetCode332题的旅行行程重排,涉及图的构建、排序和深度优先搜索(DFS)算法的应用,展示了Python实现的具体步骤。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


题目

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目分析

这题在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)
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值