回溯
Jelly_Believer
这个作者很懒,什么都没留下…
展开
-
leetcode37 解数独(二维递归)
从左到右,一列一列的填,填完了就再填下一行class Solution {public: bool isValid(vector<vector<char>> &board, int row, int col, char k){ //检查列 for(int i = 0; i < 9; i++){ if(board[i][col] == k) return false; } .原创 2021-11-02 08:38:45 · 91 阅读 · 0 评论 -
Leetcode 重新安排行程
“一笔画”问题:通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路具有欧拉回路的无向图称为欧拉图具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图...原创 2021-10-29 10:42:34 · 121 阅读 · 0 评论 -
排列问题汇总
排列和组合的区别是 分顺序46全排列class Solution {public: vector<vector<int> > res; vector<int> path; void backtracking(vector<int> nums, vector<bool> &used){ if(path.size() == nums.size()){ res.push_bac原创 2021-10-27 17:15:55 · 157 阅读 · 0 评论 -
子集问题汇总
组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!(但子集也是组合问题,故普通子集也是很简单的)下面看子集问题的升级版:与子集的区别是 集合里面有重复元素,而且求取的子集得去重。去重方法和组合总和2的套路一样,分树枝去重和树层去重。更升级:通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组经行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!在图中可以看出,同一父节点下的同层上使用过的元素就不能在使用了递归函数上面的u.原创 2021-10-27 15:31:16 · 277 阅读 · 0 评论 -
leetcode93 复原IP地址
思路:直接在原字符串s上面切割,即加’.’.因为规定了是固定切割数量3,即四段,故不能以startIndex = s.size()作为终止条件,设置一个变量pointNum, 当pointNum = 3得时候,就开始检查从startIndex到s.size()-1这一段是否valid,若有效则直接将s push进res中class Solution {public: // 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法 bool isValid(const..原创 2021-10-25 20:47:33 · 85 阅读 · 0 评论 -
131. 切割回文串
切割问题类似组合问题如对于字符串abcdef组合问题:选a之后,再到bcdef里选b,再到cdef里选c…切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中在切割第三段…如aab,先选a,再选a, 再选b 然后选aa 选b 最后选aab代码:class Solution {public: bool isHuiwen(string s){ int l = 0, r = s.size() - 1; if(s == "") r..原创 2021-10-25 09:44:13 · 117 阅读 · 0 评论 -
leetcode 划分为k个相等的子集(回溯)&& 分割等和子集 (dp)&&最后一块石头的重量 && 目标和
选择列表:nums结束条件:k == 4思路:n个数字,每个数字都要选择进入到k个桶中的某一个bool canPartitionKSubsets(vector<int>& nums, int k){ if(k > nums.size()) return false; vector<int> bucket(k, 0); int sum = 0; for(auto v : nums) sum += v; if(sum % k != 0) r原创 2021-07-18 18:32:06 · 209 阅读 · 0 评论 -
Leetcode 40. Combination Sum(组合总和 II)
@Leetcode这题与Leetcode 39 Combination Sum(组合总和)的区别是:本题candidates里面的元素每个只能使用一次本题candidates里的元素有重复, 而Leetcode 39 Combination Sum(组合总和)里candidates元素不重复.难点:集合有重复元素,但还不能有重复的组合。解决:组合问题为树形结构,“使用过某个元素”在树型结构上有两个维度,一个维度是同一树枝上使用过,另一个是同一层使用过。题目要求的是组合不能重复,而组合内的元素原创 2021-04-10 10:43:15 · 143 阅读 · 0 评论 -
Leetcode216 组合总和III
@Leetcode相对于组合问题,只是多了一个限制,即所求集合总和为n;回溯三步曲确定递归函数参数void generateSum(int k, int n, int sum, int startIndex,vector &p)确定终止条件if(p.size() == k){ if(sum == n) res.push_back(p); //如果相等,则入数组 return;//否则返回}单层搜索过程for(int i = startI原创 2021-04-10 09:23:52 · 150 阅读 · 0 评论 -
Leetcode 79 word search
@word search 二维平面回溯法回溯三步曲返回值与参数bool wordSearch(vector<vector>& board, string word, int index, int startx, int starty)//从board[startx][starty]开始,寻找word[index…word.size()]//index表示单词的第几个字母//返回值为bool型,表示从(startx, starty)开始是否可以找到目标单词。终止条原创 2021-04-09 14:28:04 · 107 阅读 · 0 评论 -
LeetCode 51. N皇后
N-Queens回溯三步曲首先说明一下需要用到的变量:vector col, dia1, dia2;//分别表示col[i]列, 对角线dia1[i]和dia2[i]是否已有旗子。//正对角线规律:每条对角线 行 - 列为一个定值//副对角线规律:行 - 列 + n -1为一个定值返回值及参数//在一个n皇后问题中,摆放第index行皇后位置,row存放一个可能的解void putQueen(int n, int index, vector &row)终止条件原创 2021-04-09 11:21:01 · 66 阅读 · 0 评论 -
Leetcode 17 Letter combination of a phone number
用暴力的方式枚举所有可能性树形结构回溯三步曲树形结构回溯三步曲返回值与参数void findCombination(const string &digits, int index, const string &s)终止条件if(index == digits.size()){ res.push_back(s); return; }搜索过程 for(int i = 0; i &原创 2021-04-09 10:53:01 · 132 阅读 · 0 评论 -
Leetcode46 Permutations
Permutations(与顺序有关)Perms(nums[0…n-1]) = {取出一个数字} + Perms( nums[{0…n-1} - 这个数字] )搜索的元素之间,互相是冲突的,故状态也需要回溯class Solution {private: //p中保存了一个有index个元素的排列 //向这个排列的末尾添加index+1个元素,获得一个有index+1个元素的排列 vector<vector<int>> res; vecto原创 2021-04-09 10:25:14 · 113 阅读 · 0 评论 -
LeetCode77 Combinations
@LeetCode把组合问题想象为如下树形结构每次从集合元素中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。图中n相当于树的宽度,k相当于树的深度。每次搜索到叶子结点,我们就得到了一个结果。只需要把达到叶子结点的结果收集起来,就可以求得n个数中k个数的组合集合。回溯三步曲递归函数的返回值以及参数参数除了必须的n和k外,还需要一个startIndex,这个参数用来记录本层递归中,集合从哪里开始遍历(集合为[1,…,n])每次从集合中选取元素,可选择的范围随着选择的进行而收缩,原创 2021-04-08 21:07:18 · 155 阅读 · 0 评论 -
Leetcode 39 Combination Sum(组合总和)
@Leetcode本题与Leetcode216 组合总和III以及LeetCode77 Combinations的区别是,集合里面的元素可以重复使用,故递归没有层数限制,只要选取元素总和为target,即可返回。而另外两个知道得递归k层,因为要取k个元素的集合。回溯三步曲递归函数参数void generateSum(vector<int>& candidates, int target, int startIndex, int &sum, vector<int&原创 2021-04-10 10:19:31 · 169 阅读 · 0 评论