332. 重新安排行程

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

示例 1:
在这里插入图片描述
输入:tickets = [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]]
输出:[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]
示例 2:

在这里插入图片描述

输入:tickets = [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出:[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释:另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”] ,但是它字典排序更大更靠后。

提示:

1 <= tickets.length <= 300
tickets[i].length == 2
fromi.length == 3
toi.length == 3
fromi 和 toi 由大写英文字母组成
fromi != toi

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reconstruct-itinerary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最初使用图论的时候,pta是给出每个边,然后用数组建立边和边的关系大致就是

linjie[a][length[a]++]=b;

但是python教会我做人了
对于字符串这样的是没办法继续用传统数组了
今天发现一个好东西:字典的键值对
而且有了这东西,在字典里面对应链接的点直接做成了一个数组(我爱python)

         d={}
         for a,b in tickets:
             d.setdefault(a,[]).append(b);

是的,用这三行就不用建图了hhh
解释一下,d是字典,setdefault(a,[])是在字典里面找a的值,如果能找到,就返回对应位置,找不到就建立新的索引,返回给定值(这里面是[]),但是这个返回值没啥用,只要能把图建立起来就行
而且python更强大的地方在于
对于

a={'a':1,'d':[2,3]}

这样的一个字典,a[‘d’]=[2,3];
在字典里面这个索引不再只是数字
这样的话就方便多了
以上只是对字典的介绍
下面来讨论一下这道题
这个题是一个连通图,要么有欧拉回路(能回到‘JFK’),要么有欧拉通路(回不到‘JFK’)在考虑仅有欧拉通路的情况下,‘JFK’连接的某一个点(只能存在一个点,并且整个图里面只能存在一个入度-出度=1的点)可能是一个死胡同,或者说死胡同不知道在哪个位置被搜索到,这个死胡同是指字典序在前边,还是个死胡同,引用官方题解,形如:
在这里插入图片描述
AAA排在BBB前边,先搜索AAA,提前进入死胡同导致出错
这样的话,可以这样来处理,将遍历完所有边的结点最后放到结果数组里面,然后把结果数组逆序返回
这样的好处是如果AAA先遍历完成,那他就可以先入栈,最后将数组逆序的时候,AAA就在前面了
例题:
考虑这个连通图:
在这里插入图片描述
进行模拟堆栈演示
在这里插入图片描述
(画图技术不佳,敬请谅解)
就是之所以会出现AA在最后这个现象,是因为,最先访问的如BBB(按照字母顺序)是没有解栈的(释放栈)而AA由于先访问完了,所以解栈,由于这样的死胡同只有一个,不必过多考虑,所以这样的元素应该放在后面
放个代码:

class Solution:
    def __init__(self):
        self.result=[];
    def dfs(self,jiedian,d):
        if(jiedian in d):
            while(len(d[jiedian])!=0):
                self.dfs(d[jiedian].pop(0),d);
        self.result.append(jiedian)
    def findItinerary(self, tickets ) :
         d={};
         for a,b in tickets:
             d.setdefault(a,[]).append(b);
         for i in d:
             d[i]=sorted(d[i])
         self.dfs("JFK",d)
         return self.result[::-1]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值