回溯
文章平均质量分 54
# 回溯
lucky tiger
要一直前进,一直静下心来学习。
展开
-
回溯递归(小结)
回溯是一种算法思想,递归是一种编程方法。回溯方法整体思路:搜索每一条路,每次回溯是对具体的一条路径而言的。对当前搜索路径下的未探索区域进行搜索,则可能有两种情况:1、当前未搜索区域满足结束条件,则保存当前路径并退出当前搜索;2、当前未搜索区域需要继续搜索,则遍历当前所有可能的选择;如果该选择符合要求,则把当前选择加入当前的搜索路径中,并继续搜索新的未搜索区域。一般回溯用在需要保存所有情况的题中,也就是不是计算有多少符合条件的情况。模板1res = []path = []de原创 2021-03-12 22:16:04 · 184 阅读 · 0 评论 -
力扣78子集 回溯
1、这几天找完工作没怎么做题手生了和前几天的回溯一样这道题只不过是没有限定子集的长度class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>>vec; if(nums.size() == 0)return vec; vector<int原创 2020-09-24 16:07:57 · 231 阅读 · 0 评论 -
力扣47 全排列ii 回溯加剪枝
这题难点在于先排序,然后重复的数字112 used[i-1]= fase 代表之前我用过了,就是我俩 1前面的用过了现在这一个我就直接跳过去class Solution {public:vector<bool> used; vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(),nums.end()); vect.原创 2020-09-18 22:16:12 · 174 阅读 · 0 评论 -
力扣 79单词搜索 回溯
递归过程大概就是这么一个过程、执行一般去下一级,最里面一级结束返回。class Solution {public: bool exist(vector<vector<char>>& board, string word) { if(board.size() == 0 || board[0].size() == 0)return false; int row = 0; int line = 0; ..原创 2020-09-14 15:26:45 · 118 阅读 · 0 评论 -
力扣216 组合总和III
和昨天的II差不多,回溯+剪枝,判断一下个数就好class Solution {public: vector<vector<int>> combinationSum3(int k, int n) { vector<int>num = {1,2,3,4,5,6,7,8,9}; vector<vector<int>>res; if(n < 0 || k <= 0)原创 2020-09-11 14:28:10 · 174 阅读 · 0 评论 -
力扣 40组合总和 II
一种暴力去重一种中间去重暴力去重是直接算出结果后用set insertclass Solution {public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>>res; sort(candidates.begin(),candidates原创 2020-09-10 10:00:08 · 149 阅读 · 0 评论 -
39组合总和 回溯加剪枝
自己写的,有点耗时,能用就行class Solution {public: vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>>res; sort(candidates.begin(),candidates.end()); if(candid原创 2020-09-09 11:04:18 · 95 阅读 · 0 评论 -
力扣77组合 回溯+剪枝
回溯+剪枝每次看到这种题知道是回溯就是写不出来。。。好虐心,还得多总结剪枝就是优化时间复杂度的先把回溯写出来回溯一般就是push dfsd递归 pop,放进去递归返回的时候popclass Solution {private : void dfs(int n, int k, int index, vector<int>& path, vector<vector<int>>& res) { if (path.size(...原创 2020-09-08 21:13:17 · 188 阅读 · 0 评论 -
力扣17.电话号码的字母组合 回溯
class Solution {public: vector<string> letterCombinations(string digits) { vector<string> combinations; if (digits.empty()) { return combinations; } unordered_map<char, string> phoneMap{...原创 2020-08-26 17:26:52 · 370 阅读 · 0 评论 -
力扣491递增子序列 回溯+剪枝
class Solution {public: vector<int> temp; vector<vector<int>> ans; void dfs(int cur, int last, vector<int>& nums) { if (cur == nums.size()) { if (temp.size() >= 2) { ans.p...原创 2020-08-25 21:03:14 · 202 阅读 · 0 评论 -
力扣93.复原IP地址 回溯+剪枝(细节有点多,慢慢想)
1、"25525511135"2、25、255记录现在点的个数和上一个点位置class Solution {public: vector<string> res; vector<string> restoreIpAddresses(string s) { int n = s.size(); string cur = s; helper(n,0,-1,cur,s); return res;原创 2020-08-13 09:44:13 · 252 阅读 · 1 评论 -
回溯问题(回溯剪枝)
由于回溯算法的时间复杂度很高,因此,如果在遍历的时候,如果能够提前知道这一条分支不能搜索到满意的结果,就可以提前结束,这一步操作称之为剪枝。回溯算法会大量应用“剪枝”技巧达到以加快搜索速度。有些时候,需要做一些预处理工作(例如排序)才能达到剪枝的目的。预处理工作虽然也消耗时间,但一般而且能够剪枝节约的时间更多。还有正是因为回溯问题本身时间复杂度就很高,所以能用空间换时间就尽量使用空间。否则时间消耗又上去了。大佬力扣写的很详细:https://leetcode-cn.com/problems/pe原创 2020-07-23 14:47:16 · 1828 阅读 · 0 评论 -
力扣 剑指offer 12.矩阵中的路径 回溯
1、2、class Solution {public: bool exist(vector<vector<char>>& board, string word) { if (board.empty() || board[0].empty()) return word.empty(); for (int row = 0; row < board.size(); ++row) {原创 2020-06-21 16:09:16 · 218 阅读 · 0 评论