力扣每日打卡8月27日打卡(332. 重新安排行程,中等)图,邻接表,递归,未做出,看懂

在这里插入图片描述

邻接表+递归

我的思路:
在python中要引入import collections
步骤:
1先将图存入邻接表
2将邻接表中的元素进行排序
3依次按键取出值,在将值作为下一次的键进行递归,
4最后将遍历过的值从后往前依次加入到列表里

核心思想–深度搜索+回溯

大佬思路:
# 首先先把图的邻接表存进字典,然后对字典的value进行排序
# 然后从’JFK’开始深搜,每前进一层就减去一条路径,
# 直到某个节点不存通往其他节点的路径时,说明该节点就为此次行程的终点
# 需要跳出while循环进行回溯,返回到上一层节点进行搜索,再次找到倒数第二个终点,依次类推
# 设定ans为返回答案,每次找到的节点都要往头部插入

    # 举例说明:[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
    # 构建领接表的字典:{'JFK': ['SFO', 'ATL'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']})
    # 按照题目要求对字典的val排序:{'JFK': ['ATL', 'SFO'], 'SFO': ['ATL'], 'ATL': ['JFK', 'SFO']})
    # 开始从 JFL 开始进行dfs搜索
    # 1.JFK --> ALT  
    #   JFK pop出ALT,JFK的字典变为:'JFK': ['SFO']
    # 2.JFK --> ALT --> JFK 
    #   ALT pop出JFK,ALT的字典变为:'ALT': ['SFO']
    # 3.JFK --> ALT --> JFK --> SFO 
    #   JFK pop出SFO,JFK的字典变为:'JFK': ['']
    # 4.JFK --> ALT --> JFK --> SFO --> ATL 
    #   SFO pop出ALT,SFO的字典变为:'SFO': ['']
    # 5.JFK --> ALT --> JFK --> SFO --> ATL --> SFO
    #   ATL pop出SFO,ATL的字典变为:'ATL': ['']
    # 此时我们可以发现SFO的val为空,没有地方可以去了,说明我们已经找出了终点SFO
    # 然后向上回溯,依次将其添加到ans中
    # 最终答案为:["JFK","ATL","JFK","SFO","ATL","SFO"]

参考链接:https://leetcode-cn.com/problems/reconstruct-itinerary/solution/332-zhong-xin-an-pai-xing-cheng-chao-xiang-xi-ti-j/

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        # 方法一:建立邻接表
        list_lin = collections.defaultdict(list)
        for i, j in tickets:
            list_lin[i] += [j]
        
        # 对邻接表中元素进行排序
        for key in list_lin:
            list_lin[key].sort()

        # 递归计算路径
        res = []
        def dfs(val):
            while list_lin[val]:
                dfs(list_lin[val].pop(0))
            res.insert(0, val)
        dfs('JFK')
        return res

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值