LC回溯
回溯
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 37.解数独
添加链接描述原创 2022-08-08 16:26:39 · 84 阅读 · 0 评论 -
LeetCode 351. 安卓系统手势解锁 (枚举子集+全排列、回溯)
351. 安卓系统手势解锁方法一实际上就是A(9,i)A(9,i)A(9,i)的实现,先通过状态的枚举求出子集,然后使用next_permutation()求出全排列。const int N = 400000;class Solution {public: pair<int,int> toDot(int x) { return {x/3,x - x/3*3}; } bool ok(vector<int>& a) {原创 2021-06-11 17:20:54 · 221 阅读 · 0 评论 -
LeeCode 131. 分割回文串 (回溯)
131. 分割回文串经典回溯题。理论上来讲,是要进行回文的判定的预处理的。但是时间复杂度已经是指数级的,优化一下,意义不是很大。class Solution {public: vector<vector<string>> ans; // 记录分割结果 vector<string> temp; vector<vector<string>> partition(string s) { dfs(原创 2021-03-07 15:37:56 · 86 阅读 · 0 评论 -
LeetCode 140. 单词拆分 II (DP+回溯法+字典树)
140. 单词拆分 II一种极端情况—— 字典里的单词不能拼成目标单词,这个时候无需判断,这个时候直接使用 单词拆分的代码判断一下就好。然后使用回溯法去拆分单词就好时间复杂度:(2∣s∣)(2^{|s|})(2∣s∣) (在最坏情况下,每个位置都有两个选择。)class Trie{ struct Node{ bool end = false; Node* children[26] = {0}; }; Node* root = new Nod原创 2020-11-02 00:37:24 · 163 阅读 · 0 评论 -
LeetCode 52. N皇后 II (状态数组、回溯法)
52. N皇后 II代码还挺简洁class Solution {public: int ans = 0,n; bool sc[20] = {0}, sx[40] = {0}, sy[40] = {0}; int totalNQueens(int N) { n = N; dfs(0); return ans; } void dfs(int r){ if(r==n){ ans++原创 2020-10-17 15:12:47 · 77 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合 (回溯)
电话号码的字母组合class Solution {public: map<int,vector<char>> mp; vector<string> ans; string s; vector<string> letterCombinations(string digits) { if(digits.size()==0) return ans; int k = 0; for(in原创 2020-09-16 20:07:50 · 82 阅读 · 0 评论 -
LeetCode 79. 单词搜索 (回溯、DFS搜索)
单词搜索const int dx[] = {-1,0,1,0} ;const int dy[] = {0,1,0,-1} ;class Solution {public: bool vis[210][210] = {0}; int m,n; bool exist(vector<vector<char>>& board, string word) { m = board.size(); n = board[0].s原创 2020-06-25 14:07:05 · 97 阅读 · 0 评论 -
LeetCode 257. 二叉树的所有路径 (回溯)
二叉树的所有路径分析一下时间复杂度:每个点都只会遍历一次,时间复杂度:O(n)O(n)O(n)。在最坏情况下,是一个满二叉树,时间复杂度:O(n∗log(n))O(n*log(n))O(n∗log(n))/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) :原创 2020-09-04 00:32:43 · 165 阅读 · 0 评论 -
LeetCode 491. 递增子序列(回溯如何去重、决策的限制)
491. 递增子序列回溯法没什么可说的,关键是如何去重,可以用set,也可以类似使用字符串hash。还有就是下面这种做法。假设有两个相同的元素,有四种情况,用0表示不选、1表示选。0 00 11 01 1发现3、4种情况重复了,于是强制如果当前元素和上一次选的元素重复的了,就必须要选。class Solution {public: vector<vector<int>> ans; vector<int> v; vector<原创 2020-08-26 11:24:40 · 123 阅读 · 0 评论 -
LeetCode 面试题 08.09. 括号(回溯法、有效括号)
面试题 08.09. 括号回溯法没什么好说的,主要是每一步的括号选择策略,如果是任意选择的话,会产生很多冗余搜索。按照有效括号的生成规则,只有在左括号的数量大于右括号的时候,才可能去增加右括号。class Solution {public: vector<string> ans; string temp; int n; vector<string> generateParenthesis(int n) { this->n原创 2020-08-06 19:54:50 · 158 阅读 · 0 评论 -
LeetCode 113. 路径总和 II (回溯、路径记录)
路径总和 II 与112路径总和思路是一样的,只是在这里多了一个路径记录罢了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {pu原创 2020-06-25 05:21:17 · 111 阅读 · 0 评论 -
LeetCode 996. 正方形数组的数目 (回溯、结果去重、等价情况剪枝)
正方形数组的数目思路:回溯题基本写法。用multiset<int>去记录数字的使用情况。用set<vector<int>>去重。剪枝:虽然数字可以重复使用(如果有的话),但是每一层的数字不应出现重复枚举。比如:2 2 2 2 2每一层都应该放只能放2,而不是对2这个数字进行多次搜索。class Solution {public: multiset<int> nums; set<vector<int>&g原创 2020-06-20 03:13:13 · 196 阅读 · 0 评论