![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
回溯
这里记录回溯相关的算法
哎呦,帅小伙哦
这个作者很懒,什么都没留下…
展开
-
LeetCode 37 解数独
这个题,如果自己写写不出来,有几个值得注意的点自己想不到,代码注释很详细,这里直接上代码。 class Solution { public: void solveSudoku(vector<vector<char>>& board) { backtrack(board, 0, 0); } bool backtrack(vector<vector<char>>& board, int row, int原创 2021-05-17 16:53:22 · 66 阅读 · 0 评论 -
LeetCode 51 N皇后
分析 这个问题的本质和全排列问题差不多,决策树的每一层表示棋盘上的每一行;每个节点可以做出的选择是,在该行的任意一行放置一个皇后。函数backtrack函数像在决策树上游走的指针,每个节点就表示在board[row][col]上放置皇后,通过isValid函数可以将不符合条件的情况剪枝。在前面的博客讲解了回溯算法的框架,其实回溯算法就是改改做选择的方式,排除不合法选择的方式而已,只要框架存于心,面对的就是小问题。 代码 class Solution { public: vector<vec.原创 2021-05-16 22:04:07 · 55 阅读 · 0 评论 -
回溯算法
解决一个回溯问题,实际就是一个决策树的遍历过程。只需要思考3个问题: 1)路径:也就是已经做出的选择 2)选择列表:也就是你当前可以做的选择 3)结束条件:也就是到达决策树底层,无法再做选择的条件 回溯算法的通用框架如下: result = [] def backtrack(路径,选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表); 撤销选择 其核心就是for循环里面的递归原创 2021-05-16 20:11:48 · 94 阅读 · 0 评论 -
LeetCode 140 单词拆分
思路 使用的是回溯的思想,思路比较简单。注意从string中删除字符的方法。trans函数可以对第一个参数进行优化,可以传递两个整数来标志当前可以选择的路径。 代码 class Solution { public: vector<string> ans; vector<string> wordBreak(string s, vector<string>& wordDict) { map<string, bool> m.原创 2021-08-18 00:02:47 · 63 阅读 · 0 评论 -
LeetCode 79 单词搜索
分析 凡是有决策树的都可以使用回溯来做,开始想把traverse函数写成回溯函数,但是它不具有决策树,要把有决策树的部分拿出来。 代码 class Solution { public: vector<vector<char>> board; vector<vector<bool>> judge; vector<int> dir{-1, 0, 1, 0, -1}; int m; int n; boo.原创 2021-05-18 11:48:52 · 49 阅读 · 0 评论 -
LeetCode 60 排列序列
分析 使用回溯模拟排列,使用一个变量th来判断时候到达第k个最小的数。在做选择的条件那注意不能用find,否则会超时。 代码 class Solution { public: int th; string ans; string getPermutation(int n, int k) { string s; vector<bool> vec(9, false); this -> th = 0; .原创 2021-05-17 23:36:59 · 82 阅读 · 0 评论 -
LeetCode 47 全排列
分析 这道题要比46题要难,主要难在nums可能会有重复的数字,因为有重复的数字,所以为了标识哪个数字被选择可以用一个bool数组来记录一下,在做选择和撤销选择的时候需要同步,需要注意的是for循环里面做选择的条件,画出决策树之后就很好理解了。 代码 class Solution { public: vector<vector<int>> vec; vector<vector<int>> permuteUnique(vector<in.原创 2021-05-17 20:40:44 · 54 阅读 · 0 评论 -
LeetCode 22 括号生成
分析 利用回溯解决,有关括号问题,你需要记住两个性质: 1)一个合法括号组合的左括号数量一定等于右括号数量,这个显而易见。 2)对于一个合法的括号字符串组合p,必然对于任何0 <= i < len§都有:子串p[0…i]中左括号的数量都大于或等于右括号的数量。 backtrack函数中参数left是字符串s中左括号的数量,参数right是字符串s中右括号的数量。 代码 class Solution { public: vector<string> vec; ve.原创 2021-05-17 18:32:24 · 42 阅读 · 0 评论 -
LeetCode 216 组合总和
分析 回溯框架,关键要理解backtrack函数像一个指针在决策树上游走的含义。 代码 class Solution { public: vector<vector<int>> vec; int k,n; vector<vector<int>> combinationSum3(int k, int n) { this -> k = k; this -> n = n; vec.原创 2021-05-17 12:54:34 · 78 阅读 · 0 评论 -
LeetCode 39 组合总数
分析 套用回溯模板,回溯算法都是改一下结束条件,改一下做选择的条件即可。 代码 class Solution { public: vector<vector<int>> vec; vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<int> temp; backtrac.原创 2021-05-17 12:23:42 · 88 阅读 · 0 评论 -
LeetCode 77 组合
分析 典型的回溯算法,直接套用回溯的算法框架 代码 class Solution { public: vector<vector<int>> vec; vector<vector<int>> combine(int n, int k) { vector<int> temp; backtrack(n, k, 1, temp); return vec; } void .原创 2021-05-16 22:29:15 · 49 阅读 · 0 评论