刷题-回溯树算法
主要针对leetcode中应用回溯算法的案例
夜灬凄美
这个作者很懒,什么都没留下…
展开
-
Leetcode 138. 复制带随机指针的链表-递归(回溯)+hashmap
解题思路:本题要求进行深拷贝,而且存在一个随机指针,这个指针的指向可能还没在当前链表中,所以要先进行存储,这里采用hashmap进行存储,其中key表示原结点,val表示新创建的结点注意:1.递归结束条件为head==nullptr2.map的存储问题/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node(int _val).原创 2021-07-22 09:37:21 · 71 阅读 · 0 评论 -
Leetcode 78. 子集-回溯
解题思路:本题是返回解的集合,考虑选用回溯来暴力递归,这里题目说数组元素互不相同,要求返回的子集不重复,只需要利用index来控制不走回头路注意:1.递归返回条件2.index的使用,注意在函数参数传递的时候传的是i+1class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>&..原创 2021-07-12 15:04:42 · 39 阅读 · 0 评论 -
leetcode 46. 全排列-回溯算法
解题思路本题输出所有可能的排列,采用回溯算法注意:1.筛选条件class Solution {public: vector<vector<int>> permute(vector<int>& nums) { vector<int>path; vector<vector<int>>res; unordered_set<int>myset;//存..原创 2021-07-03 20:34:11 · 96 阅读 · 0 评论 -
leetcode 39. 组合总和-回溯算法
解题思路:本文要求给出所有符合条件的组合,考虑采用不会走回头路的回溯算法注意:1.递归退出条件2.不走回头路设置3.提前结束(break)class Solution {public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end()); vector...原创 2021-07-03 20:09:32 · 113 阅读 · 0 评论 -
leetcode LCP 07. 传递信息-回溯算法
解题思路:本题就是一个有向图的遍历问题,可以采用深度优先,广度优先,回溯等递归算法,本题的解答方法采用回溯算法注意:1.递归结束条件2.数组遍历边界问题3.筛选条件class Solution {public: int numWays(int n, vector<vector<int>>& relation, int k) { if(relation.size()==0)return 0; vector<int..原创 2021-07-01 10:43:45 · 109 阅读 · 0 评论 -
Leetcode -剑指 Offer 38. 字符串的排列-回溯法
解题思路:题目要求输出所有排列,这种类似于暴力破解方法可以考虑选用回溯法进行递归遍历,同时加入一些选择条件,来判断是否符合条件,注意本题要求输出的结果中不能存在重复元素,所以考虑用set存储注意:1.如何判断某一个元素是否被加入到路径中,这里可以选用一个数组来记录索引位置是否被加入到路径,注意设置记录为true或者false的时机2.判断满足条件加入到路径中class Solution {public: vector<string> permutation(str..原创 2021-06-22 09:52:56 · 89 阅读 · 0 评论 -
leetcode 1863. 找出所有子集的异或总和再求和-回溯法
解题思路:本文要遍历所有子集,所以可以考虑回溯法,因为每一个都会被遍历到,而且方便筛选符合条件的结果注意:1.结果反回值的处理2.递归退出的条件3.加入路径的筛选class Solution {public: int subsetXORSum(vector<int>& nums) { int res = 0; vector<int> path; trace(nums,path,res,0); ..原创 2021-06-19 20:22:11 · 170 阅读 · 0 评论 -
leetcode 1239. 串联字符串的最大长度-回溯法
解题思路:本题要求返回的是最长长度,因为每一次再做拼接时候,需要考虑自身的每一个字符是否是不重复的,而且还要考虑,自身字符是否和已存在满足要求的字符串重复,随意需要整个遍历很多次,然后只选择满足要求的部分加入到路径中,选择采用回溯算法注意:1.注意满足加入路径的条件2.遍历条件3.在递归后面加入pop操作class Solution {public: int maxLength(vector<string>& arr) { int curr = 0; i..原创 2021-06-19 14:52:30 · 82 阅读 · 0 评论 -
Datawhale模拟面试每日打卡 day-16 22. 括号生成
解题思路本题要求本质上就是找出所有组合,这里我们可以想出类似于全排列,所以可以选用DFS也就是递归回溯树算法回溯算法步骤:1.创建递归函数并且设置合理参数2.设置递归结束条件3.循环或者选择遍历候选的元素4.调用递归函数5.回退到上一层class Solution {public: void backTrack(vector<string>& res,string& cur,int open,int close,int n){ ..原创 2021-06-11 08:57:03 · 80 阅读 · 0 评论