回溯
leetcode 回溯算法归纳
Qin酱
这个人是个懒狗,什么都没有留下。
展开
-
回溯算法解题思路
140. 单词拆分 II题目:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。原创 2020-08-15 18:54:26 · 2480 阅读 · 0 评论 -
leetcode 216. 组合总和 III
216. 组合总和 III找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]使用回溯方法:1.确定回溯的弹出条件,列表的值相等,数量也为k2.回溯中的循环,由于不能有重复,需要一个索引参数inde原创 2020-07-24 11:25:59 · 94 阅读 · 0 评论 -
leetcode 212. 单词搜索 II
212. 单词搜索 II给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例:输入:words = [“oath”,“pea”,“eat”,“rain”] and board =[[‘o’,‘a’,‘a’,‘n’],[‘e’,‘t’,‘a’,‘e’],[‘i’,‘h’,‘k’,‘原创 2020-08-02 19:31:19 · 164 阅读 · 0 评论 -
leetcode 131. 分割回文串
131. 分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出:[[“aa”,“b”],[“a”,“a”,“b”]]本题使用回溯算法:1.首先回溯弹出的条件就是需要判断的字符串为空2.回溯的过程,由于我们在判度是否是回文字符串的时候,使用的是s[:i]左闭右开的区间,所以在循环的时候,索引值为(1, len(s)+1)。只有当左边的字符串的是回文串的时候,才进行下一步的判度。3.在进行下一层回溯的时原创 2020-07-24 10:42:30 · 236 阅读 · 0 评论 -
leetcode 93. 复原IP地址
93. 复原IP地址给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。示例:输入: “25525511135”输出: [“255.255.11.135”, “255.255.111.35”]还是属于回溯列举的范畴,每次加入的数据长度有1,2,3,共三种选择,所以下面的for 循环内是(0,4).意思就是每次都可以选择加入数据长度为1,2,3的数据,每个都组合都需要遍历一次,原创 2020-07-03 16:02:04 · 222 阅读 · 0 评论 -
leetcode 90. 子集 II
90. 子集 II给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]这道题也是回溯算法里面的一个经典例子,但是就是要出去重,后一个元数在与前一个元数相同的时候,我们就可以跳过这次递归。所以这里重要的就是去重的条件判断nums[ j ] == nums[ j - 1 ]j 要大于当前的起始索引值, 例如这里就是 j原创 2020-07-22 18:00:00 · 100 阅读 · 0 评论 -
leetcode 79. 单词搜索
79. 单词搜索给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]]给定 word = “ABCCED”, 返回 true给定 word = “SEE”, 返回 true给定 word = “ABCB”, 返回原创 2020-07-22 00:21:57 · 131 阅读 · 0 评论 -
leetcode 78. 子集
78. 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]使用回溯算法,外面再加一个循环即可。from typing import Listclass Solution: def subsets(self, nums: List[int]) -> List[List[i原创 2020-07-06 16:30:27 · 118 阅读 · 0 评论 -
leetcode 77. 组合
77. 组合给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]回溯算法,由于这里的数组是排过序的,所以不需要used列表,不能重复使用,所以for 循环的起始位置要每次回溯的时候后移移一位。后面一种方法不仅对i限制了下界,还限制了上界。from typing import Listclass Solution: def com原创 2020-07-05 15:45:13 · 97 阅读 · 0 评论 -
leetcode 60. 第k个排列
60. 第k个排列给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。示例 1:输入: n = 3, k = 3输出: “213”示例 2:输入: n = 4, k = 9输出: “2314”使用一般回溯法,超原创 2020-07-05 14:05:06 · 193 阅读 · 0 评论 -
leetcode 面试题 08.12. 八皇后
面试题 08.12. 八皇后设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。注意:本题相对原题做了扩展示例:输入:4输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]解释: 4 皇后问题存在如下两个不同的解法。[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", //原创 2020-07-01 12:12:21 · 243 阅读 · 0 评论 -
leetcode 52. N皇后 II
52. N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回 n 皇后不同的解决方案的数量。示例:输入: 4输出: 2解释: 4 皇后问题存在如下两个不同的解法。[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/原创 2020-07-05 09:54:48 · 130 阅读 · 0 评论 -
leetcode 47. 全排列 II
47. 全排列 II给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]这道题和上一题的不同之处在于,这道题有重复的数字,重复的数字在排列的时候会出现重复的排列,这个时候需要剪枝操作。剪枝的过程也是灵性。首先对列表进行排序,如果有相同的数值,那么我们两个相同的数字是在一起的,如果是第一次进行排列,那么所有相同的字符都会被添加到输出。再之后的回溯过程中,例如【1,1,2】如果第一遍已经输出,第二遍再回原创 2020-07-04 23:22:07 · 150 阅读 · 0 评论 -
leetcode 46. 全排列
46. 全排列给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]本题使用的回溯的方法,每次加入一个不重复的字符进去,回溯函数内的for 循环的次数为输出的字符的长度。from typing import Listclass Solution: def permute(self, nums: List[int]) -> List原创 2020-07-04 18:32:03 · 114 阅读 · 0 评论 -
leetcode 39. 组合总和
39. 组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入: candidates = [2,3,5], tar原创 2020-06-26 11:13:03 · 159 阅读 · 0 评论 -
leetcode 40. 组合总和 II
40. 组合总和 II给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]示例 2:输原创 2020-06-26 00:00:50 · 166 阅读 · 0 评论 -
leetcode 37. 解数独
37. 解数独编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。来源:力扣(LeetCode)链接:https://leetcode-cn.com原创 2020-07-02 23:40:55 · 169 阅读 · 0 评论 -
leetcode 22. 括号生成
22. 括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]首先,看这道题目,属于生成重复类型的的,这类生成的题目比较适合使用递归来做。生成括号分为左括号和右括号,在递归的时候首先就需要设置终止条件。其中这道题的终止条件有两个:字原创 2020-06-03 11:47:03 · 161 阅读 · 0 评论 -
leetcode 17. 电话号码的字母组合
17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。使用递归的思想:将字母的组合看作树的形式例如:数字2和3的组合就是abc与def的组合。将abc看作第一层,def看作第二原创 2020-05-11 21:56:27 · 191 阅读 · 0 评论 -
leetcode 257. 二叉树的所有路径
257. 二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3使用DFS,从根节点往下面回溯寻找每一条链路,并且将其加入字符串,到达叶子节点的时候,就加入到输出out。# Definition for a binary tr原创 2020-07-26 22:02:12 · 144 阅读 · 0 评论 -
leetcode 140. 单词拆分 II
140. 单词拆分 II给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入:s = “catsanddog”wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]输出:[“cats and dog”,“cat sand dog”]示例 2:输入原创 2020-07-12 17:45:47 · 271 阅读 · 0 评论