Leetcode回溯法专题
SL_World
中国科学院大学计算机应用技术专业在读研究生
展开
-
Leetcode|字符串回溯法|22. 括号生成
1 回溯法class Solution {private: vector<string> solution; string path = "";public: void backtrack(int len, int left, int right, int n) { if (len == n * 2) { solution.push_back(path); return; } .原创 2021-06-29 15:26:47 · 178 阅读 · 0 评论 -
阿里巴巴2021年春招机器学习实习岗(运筹优化)笔试
文章目录第一题1.1 题目介绍1.2 题目条件1.3 解题思路1.4 代码第二题第一题1.1 题目介绍牛牛有一串混合数字和字母的密码,目前大意的牛牛忘记了密码,只知道密码的位数为m >= 3,以及他在键盘上的常用键数量为n >= 3,常用键中包含牛牛的密码。已知牛牛的密码中的数字至少有1位,字母至少有2位,假设题目所给输入一定满足上述条件,存在可行解,请设计算法找到牛牛密码的所有可能,每个可能的密码字符串中不能包含重复字符,且需按ASCII码升序排列打印【Input 1】3 4k n原创 2021-04-01 09:29:42 · 1207 阅读 · 0 评论 -
Leetcode回溯法四板一解模板
文章目录1 通用回溯法模板2 回溯法常用四板斧+一解(first索引+inPath+sort相邻去重+set非相邻去重)附录:本专题刷题列表致谢1 通用回溯法模板vector<xxx> solution;void backtrack(路径, 选择列表){ if (满足终止条件) { 添加路径(当前解); return; } for (选择 : 选择列表) { if (notValid(选择)) continue; 做选择; // 在选择列表中移除<选择原创 2021-03-15 16:29:00 · 469 阅读 · 1 评论 -
Leetcode|分割|93.复原 IP 地址(first索引+多条件剪枝)
1 回溯法(first索引+剪枝)本题讲真,略有麻烦,倒不是需要复杂的方法,而是根据题目要求需要多个判断才能保证AC,需要判断的条件如下只能分成4段每段数字个数∈[1, 3]每段数字个数多于1个时首个数字不能是0每段数字个数为3时不能大于255标点符号处理class Solution {private: int size; vector<string> solution; string path; const int UNIT_LEN =..原创 2021-03-15 13:03:32 · 198 阅读 · 0 评论 -
Leetcode|新数据结构|332.重新安排行程(旧数据结构组合新数据结构)
题目关键词:按字符自然排序返回每个机票只能用一次隐含信息可能给出多张相同机票(可能成环)1 回溯法(新数据结构)本题除了欧拉回路方法外,还可使用回溯法,但需要依据已有多个基础数据结构组合成新数据结构,新数据结构具体要求如下[1] 实现一对多映射——multimap满足[2] 一个key可映射到多个相同value——multimap满足[3] 按key值排序(升序)——map/multimap满足[4] 可在迭代器循环中频繁进行增删改查——不能直接对容器元素插入删除,可额外开辟.原创 2021-03-15 00:08:18 · 180 阅读 · 0 评论 -
C++11中map/multimap/unordered_map以及对应set使用回顾
前言:今天Leetcode遇到一道题很有意思,方法还是老方法,但是得换个新数据结构才能以很简单的算法AC,这就涉及到多个基础数据结构的组合,本节主要回顾一下哈希表和哈希集合在力扣中的基础用法文章目录使用场景及概述1 映射容器1.1 `map`1.2 `multimap`1.3 `unordered_map`参考文献使用场景及概述当你想通过非遍历或非穷举的方式,快速判断一个元素是否出现集合里,Hash Table是非常合适的数据结构这里先总述映射和集合的性质映射底层实现是否有序映射.原创 2021-03-14 21:52:32 · 824 阅读 · 2 评论 -
Leetcode|组合变种|491. 递增子序列(first索引+跳过非相邻重复元素)
1 回溯法(first索引+跳过未排序重复元素)刚开始分析题目时,考虑到输入有重复元素,我先sort了一下,发现不行,因为题目要求是找到所给数组当前顺序下的递增序列。但是不同顺序的两个解被视为同1个解,因此适合用组合惯用技巧first索引,但要想去除输入重复解的情况,又不能sort,那最通用的方法就是把当前层的选择通通扔到1个哈希集合中,只要有重复就选择性continue【问题考察本质】:通用型组合去重(逐个去重而非sort后的批量去重)本题策略first索引避免乱序重复跳过重复元素(set.原创 2021-03-13 20:05:15 · 164 阅读 · 1 评论 -
Leetcode|分割|131. 分割回文串(组合first索引)
1 回溯法(first索引)做这类题之前不要慌,也不要直接上手code,先把简例决策树的图画出来,然后一气呵成写代码基本就能一次AC【注意】:函数传参使用引用&来节省内存的不止vector能操作,只要是容器都有传引用的省内存的需求,string也不要忘了class Solution { int size; vector<vector<string>> solution; vector<string> path;public: .原创 2021-03-13 17:12:47 · 124 阅读 · 0 评论 -
Leetcode|组合|17. 电话号码的字母组合(无脑回溯)
1 无脑回溯题目简单,不需任何技巧,直接套用回溯模板即可【吐槽】:题目有一点没有说清楚,比如提供的输入digits里面是否有重复数字?以及输出结果中的ad是否等于da?,既然不要求顺序输出,而且返回的是组合而非排列,那么只输出da而不输出ad应该是对的,但实测错误,个人以为案例没有给全class Solution {private: int size; vector<string> solution; string path; unordered_ma..原创 2021-03-13 15:16:03 · 153 阅读 · 0 评论 -
Leetcode|排列数|377.组合总和Ⅳ(回溯法超时+动规完全背包)
1 回溯法根据题目,你会发现,本问题有几个性质不同顺序为不同解(类比排列问题)——不宜用组合中的first技巧输入无重复元素——不宜用sort+跳过重复元素技巧问题的解可以包含重复元素——不宜用inPath技巧可见,基于排列/组合/子集的三板斧技巧均不宜用在本问题中,此时回溯法基本退化成了穷举法,具体代码如下class Solution {private: int size; int count = 0;public: void backtrack(vector.原创 2021-03-13 13:05:23 · 325 阅读 · 0 评论 -
Leetcode|组合|216.组合总和III(first+右分支收紧)
1 回溯法(first+右分支收紧)有了前2道组合总和问题,再看第三道组合总和问题,简直就是弟弟,记住,排列组合子集三个问题的三板斧就是first,inPath和sort+跳过重复元素,本问题仅用first足矣class Solution {private: int size = 10; vector<vector<int>> solution; vector<int> path;public: void backtrack(in.原创 2021-03-12 23:30:39 · 180 阅读 · 1 评论 -
Leetcode|组合|40.组合总和II(排序+first+跳过重复元素+右分支收紧)
文章目录1 回溯法(排序+inPath+first索引+跳过重复元素+右分支收紧)2 回溯法(排序+first索引+跳过重复元素+右分支收紧)1 回溯法(排序+inPath+first索引+跳过重复元素+右分支收紧)首先回顾一下基本问题操作方式<组合/子集>问题输入基于回溯框架的额外操作例子无重复元素first索引剪枝左分支不同序重复解78.子集;77.组合有重复元素需要sort使重复元素相邻 + first索引剪枝左分支不同序重复解90.子集II;3原创 2021-03-12 18:00:51 · 189 阅读 · 1 评论 -
Leetcode|组合|39.组合总和(排序+first索引左收紧+右收紧)
1 回溯法(sort+first索引左收紧+右收紧)遇到这类回溯问题,先不要慌,而是要根据题目要求快速在稿纸上画出基本case的决策树,回溯框架都是一样的,只是在此基础上依据问题进行修改就轻松很多了问题输入基于回溯框架的额外操作例子无重复元素first索引剪枝左分支重复解78.子集;77.组合有重复元素需要sort使重复元素相邻 + first索引剪枝左分支重复解90.子集II;39.组合总和进一步剪枝(优化)结合已知条件收紧右分支排序(使重复元.原创 2021-03-12 16:22:49 · 170 阅读 · 1 评论 -
Leetcode|组合|77. 组合(first索引+索引距离n>还需元素个数剪枝)
文章目录1 回溯法(first索引)2 回溯法(first索引+索引距离n>还需元素个数剪枝)1 回溯法(first索引)class Solution {private: vector<vector<int>> solution; vector<int> path;public: void backtrack(int n, int k, int first) { if (path.size() == k) {原创 2021-03-12 10:28:29 · 139 阅读 · 0 评论 -
Leetcode|子集|90.子集II(排序+first索引+跳过重复元素)
1 回溯法 +class Solution {private: int size; vector<vector<int>> solution; vector<int> path;public: void backtrack(vector<int>& nums, int first, vector<bool>& inPath) { solution.emplace_back(pa.原创 2021-03-11 23:48:25 · 153 阅读 · 0 评论 -
Leetcode|子集|78. 子集(回溯+first索引)
子集II原创 2021-03-11 23:33:38 · 190 阅读 · 4 评论 -
Leetcode|排列|47. 全排列 II(排序使重复元素相邻+记录已用元素避免重复+跳过重复元素)
1 回溯法讲真,这道题加入重复元素,还是有点难度的class Solution {private: int size; vector<int> path; // 路径 vector<vector<int>> solution;public: void backtrack(vector<int>& nums, vector<bool>& inPath) { if (pat.原创 2021-03-11 20:43:57 · 236 阅读 · 0 评论 -
Leetcode|排列|46. 全排列
文章目录1 回溯法(初步套用模板)2 回溯法(swap优化)1 回溯法(初步套用模板)以下代码可以更好的理解模板的使用class Solution {private: int size; vector<vector<int>> solution; vector<int> path; // 路径public: void backtrack(vector<int>& nums, unordered_set&l原创 2021-03-11 15:55:49 · 122 阅读 · 0 评论 -
C++11哈希集合set与向量vector的互转
文章目录1 vector转set2 set转vector参考文献1 vector转set通过unordered_set的构造方法即可获得unordered_set<int> set(vec.begin(), vec.end());使用vector的rbegin()和rend()反向迭代器可以得到升序结果unordered_set<int> set(vec.rbegin(), vec.rend());完整代码#include <iostream>#inc原创 2021-03-11 14:43:55 · 10737 阅读 · 0 评论 -
Leetcode|棋盘问题|37. 解数独
回溯法class Solution {private: int size;public: bool notValid(vector<vector<char>>& board, int row, int col, char ch) { for (int i = 0; i < size; i++) { if (board[i][col] == ch || board[row][i] == ch) return..原创 2021-03-11 10:05:56 · 362 阅读 · 0 评论 -
Leetcode|棋盘问题|51. N 皇后
回溯法class Solution {private: vector<vector<string>> solution; vector<string> board; int size = 0;public: bool notValid(int row, int col) { for (int i = row - 1;i >= 0;i--) if (board[i][col] == 'Q.原创 2021-03-10 21:31:59 · 192 阅读 · 0 评论