回溯法
新名字的故事
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
37. 解数独
题目描述:编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 ‘.’ 表示。 解题思路:思路和N皇后问题是一样的,只是在找到正确答案之后就要停止递归和回溯,此外每个3*3的block的访问下标需要正确计算,代码如下: class Solution: def solveSudoku(self, board: List[List[原创 2020-12-28 20:08:45 · 105 阅读 · 0 评论 -
40. 组合总和 II
题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 解题思路:依然是回溯,需要考虑重复元素,而且组合问题的话,就是一旦考虑了,之后就不需要考虑,所以不像排列那样需要交换,直接考虑剩下的元素就可以了,代码如下: class Solution: def combinationS原创 2020-12-28 15:32:47 · 103 阅读 · 0 评论 -
47. 全排列 II
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 解题思路:和全排列一样的用dfs+回溯,只是因为可能有重复的元素,因此在进行选择是否进行当前次迭代,通过看当前值是否已经在前面遍历中出现过了,不能直接和上一个比较,因为在进行交换之后数组已经无序了,代码如下: class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: # nums.sort()原创 2020-12-26 12:07:14 · 110 阅读 · 0 评论 -
2020-12-24
题目描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 解题思路:dfs+回溯 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def binary原创 2020-12-24 11:49:17 · 214 阅读 · 0 评论 -
2020-12-23
题目描述:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: 每次转换只能改变一个字母。 转换后得到的单词必须是字典中的单词。 说明: 如果不存在这样的转换序列,返回一个空列表。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。 解题思路一:先利用字典里的单词以及开始和结尾单词构建原创 2020-12-23 20:43:16 · 115 阅读 · 0 评论 -
2020-12-23
题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。 解题思路:和矩阵中找字符串的思路是一样的,同样是回溯法加修改访问状态,这是这里的访问状态需要考虑行、列以及左右对角线,因为是n*n的棋盘,然后放的是n个皇后,所以每一行每一列都只能有一个皇后,因此我们用遍历行的方式,这样就不用记录行的访原创 2020-12-23 11:45:54 · 98 阅读 · 0 评论 -
2020-12-23
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 解题思路:同样也是回溯,只不过这里回溯的方法是采样修改访问标记的方法,而不是修改输出的方法,代码如下: class Solution: def exist(self, board: List[List[str]], word: str) -> bool: n, m =原创 2020-12-23 11:07:53 · 102 阅读 · 0 评论 -
77. 组合
题目描述:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 解题思路:也是利用回溯的方法,只是组合这里回溯的是是否把当前元素加入结果中,代码如下: class Solution: def combine(self, n: int, k: int) -> List[List[int]]: comb = [0] * k res = [] def traceback(i, index): if inde原创 2020-12-23 10:22:39 · 107 阅读 · 0 评论 -
2020-12-22
题目描述:给定一个 没有重复 数字的序列,返回其所有可能的全排列。 解题思路:回溯法,就是dfs+加上回改当前子节点状态,一次考虑每一位是可以任意一个数,选定一个数之后马上考虑下一位数,这就是dfs,只是Python需要注意,将nums添加到结果当中时,需要进行拷贝,不然返回的数组全是一样的结果,代码如下: class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = []原创 2020-12-22 17:30:12 · 103 阅读 · 0 评论
分享