332.重新安排行程

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

2.复习前
1)构造字典来记录子节点,即终点位置;考虑按字母顺序排序来访问节点,于是对终点位置集合进行排序,依次访问(贪心算法)
2)遍历过的节点应当记录下已遍历
3)终止条件:遍历完所有飞行路径,此时包括重复节点
实现难点:没有想到按字母顺序排序来访问节点,而是得到所有路径后再做比较选出最合适的一条,这样多了一次结果遍历,且不能提前跳出循环

3.实现

class Solution:def __init__(self):self.res = []def findItinerary(self, tickets: List[List[str]]) -> List[str]:n = len(tickets)ticket = defaultdict(list)state = Falsefor item in tickets:ticket[item[0]].append(item[1])for key, value in ticket.items():ticket[key] = sorted(value)[::-1]def findticket(start, tmp):nonlocal stateif state:returnif len(tmp) == n + 1:self.res = tmp[:]state = Truereturnairports = ticket[start]m = len(airports)for i in range(m-1, -1, -1):ll = airports[i]ticket[start].pop(i)tmp.append(ll)findticket(ll, tmp)tmp.pop()ticket[start].insert(i, ll)findticket("JFK", ["JFK"])return self.res

4.文章讲解
本题涉及图的概念,建议去复习:
如何识别图+构建图+图遍历方式+图结构特点

51. N皇后

1.题目
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

2.复习前
只要能构建出树,这道题就很简单了!
虽然为棋盘问题,但是一维递归

3.实现

class Solution:def solveNQueens(self, n: int) -> List[List[str]]: total = []record = []used = [0] * ndef solvequeen(tmp, row):if len(tmp) == n:record.append(tmp[:])returnfor j in range(n):if used[j] == 1:continuestate = True# tmp保存每行的列值for i in range(len(tmp)):if abs(j - tmp[i]) == abs(row - i):state = Falsebreakif not state:continuetmp.append(j)used[j] = 1solvequeen(tmp, row+1)tmp.pop()used[j] = 0solvequeen([], 0)for point in record:res = []for i in range(n):s = '.'*(point[i]) + 'Q' + '.'*(n - point[i] - 1)res.append(s)total.append(res)return total

4.文章讲解
我的实现方式是通过得到需要Q皇后的位置之后再去改变的结果数组;
其实可以在遍历时直接对Q皇后位置改动

37. 解数独

1.题目
通过填充空格来解决数独问题

2.复习前
难点:如何去定义九宫格内数字不能重复;如何去访问每个节点

3.实现

class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""used_row = [[0]*10 for _ in range(9)] # used[i][num]  针对行used_line = [[0]*10 for _ in range(9)] # used[j][num]  针对列block = [[[0]*10 for _a in range(3)] for _b in range(3)]for i in range(9):for j in range(9):if board[i][j] != '.':num = int(board[i][j])used_row[i][num] = 1used_line[j][num] = 1block[i // 3][j // 3][num] = 1print(block)def isvalid(row, col, num):row = (row // 3) * 3col = (col // 3) * 3for i in range(row, row + 3):for j in range(col, col + 3):  if board[i][j] == str(num):return False           return Truedef solve():for i in range(9):for j in range(9):if board[i][j] != '.':continuefor num in range(1, 10):# if used_row[i][num] == 1 or used_line[j][num] == 1 or not isvalid(i, j, num):#     continueif used_row[i][num] == 1 or used_line[j][num] == 1 or block[i//3][j//3][num] == 1:continue                        board[i][j] = str(num)used_row[i][num] = 1used_line[j][num] = 1block[i//3][j//3][num] = 1if solve():return Trueboard[i][j] = '.'used_row[i][num] = 0used_line[j][num] = 0block[i//3][j//3][num] = 0return Falsereturn Truesolve()

4.文章讲解
总结:
1)和N皇后一样,可以在遍历时直接对board数组原地修改;也正是直接修改从而在循环时无需传入参数就可实现对所有空白处进行访问
2)用以往的数组记录方式来标记已存在的数字是可行的,但对于Python如何用列表去定义二维、三维数组的方式不太熟悉

a1 = [0]*2  # 通过✖对[]中的元素进行重复得到[0, 0]
a2 = []*2  # 仍是[],因为此时列表内没有添加元素
a3 = [[] for _ in range(2)] # 借助迭代器,相当于对外层[]中元素[]去反复添加[]
# 等效于 a3=[] for _ in range(2): a3.append([])
# 创建三维数组
a4 = [[[0]*3 for _a in range(2)] for _b in range(2)]
'''
[[[0, 0, 0], [0, 0, 0]],...   ]
'''

3)九宫格的问题在于对每个九宫格其行号和列号的特点

后记

在这三道题的题解中会出现dfs和回溯的两种解法,简要区别:
1)回溯是特殊的dfs,回溯的应用场景在于n叉树背景,dfs经常用于二叉树
2)两者都是要走到不能再走,所以递归方式是一致的,只是回溯是一定要做撤销处理,而dfs则视情况而定,所以也称回溯是特殊的dfs
3)回溯给的模板一般都是返回空,但也有返回bool等类型的情况,大多发生于题目保证一定有符合的路径,无需写终止条件,只要得到一条路径即返回

回溯专题刷完了!总结时间到!
记模板,构建树,确定每层和递归参数,确定终止条件,如何剪枝(重要的去重技巧)
文章讲解

D30|重新安排行程+棋盘问题(N皇后+解数独)相关推荐

  1. 代码随想录【Day 30】| 332.重新安排行程 、51. N皇后 、37. 解数独

    代码随想录[Day 30] | 332.重新安排行程 .51. N皇后 .37. 解数独 332.重新安排行程 题目链接:332.重新安排行程 卡尔文解 解题思路及注意事项: 代码实现: 51. N皇 ...

  2. 代码随想录算法训练营第30天| 332.重新安排行程 、51. N皇后 、 37. 解数独

    代码随想录算法训练营第30天| 332.重新安排行程 .51. N皇后 . 37. 解数独 332.重新安排行程 开始想的是将行程进行全排列之后,然后选出一个字典排序最小的.就也是使用的回溯的思路. ...

  3. 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独

    一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...

  4. 力扣算法刷题Day30|回溯:重新安排行程 N皇后 解数独

    力扣题目:#332.重新安排行程 刷题时长:参考题解 解题方法:回溯法 + 哈希表 复杂度分析 时间 空间 问题总结 无思路 本题收获 难点 避免死循环:去过的to机场及时删除 记录映射关系:哈希表, ...

  5. 代码随想录算法训练营第三十天| 第七章 回溯算法:332.重新安排行程,51.N皇后,37.解数独(python)

    回溯算法总结 332.重新安排行程 讲解链接 class Solution:def __init__(self):self.res = []self.dict = defaultdict(list)d ...

  6. 算法训练day24 | php | 332.重新安排行程 , 51. N皇后 , 37. 解数独 ,总结

    一.力扣题332. 重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点.请你对该行程进行重新规划排序. 所有这些机 ...

  7. 代码随想录30——回溯:332重新安排行程、51N皇后、37解数独

    文章目录 1.332重新安排行程 1.1.题目 1.2.解答 1.2.1.思路 1.2.2.代码 2.51N皇后 2.1.题目 2.2.解答 3.37解数独 3.1.题目 3.2.解答 3.2.1.正 ...

  8. 代码随想录算法训练营第30天 | 51. N皇后 37.解数独 332.重新安排行程 回溯篇小结

    代码随想录系列文章目录 回溯篇 - 棋盘问题 图的dfs 文章目录 代码随想录系列文章目录 51.N皇后 37.解数独 332.重新安排行程 回溯篇小结 51.N皇后 题目链接 这道题的思路是什么样的 ...

  9. 代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独

    目录 332.重新安排行程 思路 重新安排行程 51. N皇后 思路 N皇后 37. 解数独 思路 解数独         这三道题目都是困难题目,都是根据代码随想录的思路总结书写,慢慢理解,慢慢熟练 ...

最新文章

  1. filecoin白皮书_Filecoin收益知多少?
  2. 信息学奥赛一本通C++语言——1028:字符菱形
  3. mysql 参数 列 排序_将参数放入MySQL IN()后,按降序对列进行排序?
  4. 站在过去的肩膀上(一分钟能做什么?:不可思议的“战拖”心理学)
  5. MYSQL查询语句大全集锦
  6. 8.总线设备驱动模型
  7. 数学四大思想八大方法_四种思想方法,让你轻松掌握高中数学
  8. java mpp转图片,Java使用mpxj导入.mpp格式的Project文件(甘特图)
  9. 用c语言表达圣诞节快乐的英文,双语:Merry Christmas 圣诞节快乐用英语怎么说
  10. MSP430 GPIO概述 第六章
  11. QQ电脑版 快捷cmd指令
  12. 电脑win10锁屏壁纸获取
  13. 创立达摩院,马云是想当武林盟主吗?
  14. 【uni-app】uni-app的基础知识
  15. linux.x64_11gR2_database.zip下载
  16. Android开发入门与实战之Android应用安装卸载
  17. Hive窗口函数 row_number over()和sum() over()的使用详解
  18. 赛门铁克、VERITAS中国区高管首谈分拆后公司发展
  19. 图像中的高频分量和低频分量
  20. oracle 10安装失败,安装oracle 10失败

热门文章

  1. 零基础搭建属于自己的网站--网页设计【学习笔记6】
  2. 亚马逊培训知识:亚马逊运营的工作内容有哪些
  3. 孩子成长过程中的七大需要
  4. 湖北省计算机二级报名时间2020年12,湖北省计算机二级2020年上半年报名时间及报名入口...
  5. CentosRedhat下bcm43142博通无线网卡linux驱动
  6. java工作流引擎系统授权代办操作
  7. TurboMail邮件系统-以技术打造开放性平台
  8. 每日思考第 72 期:帮助你做预测做判断的心智模型
  9. 新来了个同事,代码命名规范是真优化呀!代码如诗!
  10. Lots of Buttons的故事