
回溯法
新名字的故事
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 90 阅读 · 0 评论 -
40. 组合总和 II
题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。解题思路:依然是回溯,需要考虑重复元素,而且组合问题的话,就是一旦考虑了,之后就不需要考虑,所以不像排列那样需要交换,直接考虑剩下的元素就可以了,代码如下:class Solution: def combinationS原创 2020-12-28 15:32:47 · 87 阅读 · 0 评论 -
47. 全排列 II
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。解题思路:和全排列一样的用dfs+回溯,只是因为可能有重复的元素,因此在进行选择是否进行当前次迭代,通过看当前值是否已经在前面遍历中出现过了,不能直接和上一个比较,因为在进行交换之后数组已经无序了,代码如下:class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: # nums.sort()原创 2020-12-26 12:07:14 · 98 阅读 · 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 = Noneclass Solution: def binary原创 2020-12-24 11:49:17 · 188 阅读 · 0 评论 -
2020-12-23
题目描述:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。解题思路一:先利用字典里的单词以及开始和结尾单词构建原创 2020-12-23 20:43:16 · 99 阅读 · 0 评论 -
2020-12-23
题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。解题思路:和矩阵中找字符串的思路是一样的,同样是回溯法加修改访问状态,这是这里的访问状态需要考虑行、列以及左右对角线,因为是n*n的棋盘,然后放的是n个皇后,所以每一行每一列都只能有一个皇后,因此我们用遍历行的方式,这样就不用记录行的访原创 2020-12-23 11:45:54 · 83 阅读 · 0 评论 -
2020-12-23
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解题思路:同样也是回溯,只不过这里回溯的方法是采样修改访问标记的方法,而不是修改输出的方法,代码如下:class Solution: def exist(self, board: List[List[str]], word: str) -> bool: n, m =原创 2020-12-23 11:07:53 · 92 阅读 · 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 · 93 阅读 · 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 · 97 阅读 · 0 评论