Leetcode回溯法四板一解模板
文章目录
- 1 通用回溯法模板
- 2 回溯法常用四板斧+一解(first索引+inPath+sort相邻去重+set非相邻去重)
- 附录:本专题刷题列表
- 致谢
1 通用回溯法模板
vector<xxx> solution;
void backtrack(路径, 选择列表){if (满足终止条件) {添加路径(当前解);return;}for (选择 : 选择列表) {if (notValid(选择)) continue;做选择; // 在选择列表中移除<选择>backtrack(路径, 选择列表);撤销选择; // 将<选择>恢复到选择列表中}
}
2 回溯法常用四板斧+一解(first索引+inPath+sort相邻去重+set非相邻去重)
通过经典题目的训练,目前常用在回溯法求解问题的技巧主要有4
种,解题时依据问题性质通过混用其中一至多种可实现机械化解题,针对这四种技巧具体介绍如下
四板一解 | 功能 | 例子 |
---|---|---|
inPath备忘录(i = 0)
|
避免重复相同的选择 |
避免[1,1,1] 或[2,2,2] 出现
|
first索引(i = first)
|
避免重复相同的选择 + 避免顺序不同,但组合相同的解 |
避免[1,2,3] 和[1,3,2] 共现
|
sort相邻去重!(input[i-1]==input[i])
|
输入有重复时,避免重复完全相同的解 |
避免[2,2,3] 和[2,2,3] 共现
|
set非相邻去重!set.count(input[i])
|
输入有重复 + 不能sort时,避免重复完全相同的解 | 同上 |
bool backtrack(args) {}
|
只返回1个解使用if (backtrack()) return true;
|
—— |
添加解后无return | 同一条路径上有多个解 |
[0,1] 和[0,1,2]
|
【备注】:[1, 2, 3, 2]
就可以出现两个路径不同但完全相同的解[2, 3]
上述四板一解在不同题目中的使用情况,具体使用方法直接点击题目链接查看即可
四板斧 | 适用场景 | 题目 |
---|---|---|
inPath备忘录(i = 0)
|
排列 | 46.全排列; 47.全排列 II |
first索引(i = first)
|
组合/子集/分割 |
77.组合; 39.组合总和; 216.组合总和III; 78.子集; 131. 分割回文串; 93.复原 IP 地址 |
sort相邻去重!(input[i-1]==input[i])
|
输入有重复(辅助上述场景) | 90.子集II; 40.组合总和II; 47.全排列 II |
set非相邻去重!set.count(input[i])
|
输入有重复 + 不能排序 | 491. 递增子序列 |
bool backtrack(args) {}
|
只返回1个解 | 37. 解数独; 332.重新安排行程 |
添加解后无return | 同一条路径上有多个解(子集) | 78.子集; 90.子集II; 494. 目标和 |
其他方法 | 适用场景 | 题目 |
---|---|---|
回溯模板 + 多条件剪枝 | 棋盘问题等 | 51. N皇后; 37. 解数独; 17. 电话号码的字母组合 |
回溯模板 + 新数据结构 | 图论等 | 332.重新安排行程(欧拉回路) |
附录:本专题刷题列表
致谢
感谢「代码随想录」公众号梳理的思路,欢迎大家关注这位大佬的公号
Leetcode回溯法四板一解模板相关推荐
- leetcode——回溯法基础
1.回溯法 「回溯法」实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就「回溯」返回,尝试别的路径. 一般情况下,看到题目要求「所有可能的结果」,而不是 ...
- Leetcode 回溯法 典型例题
那些要求列举所有的情况,或者说所有的情况都要探讨一下的例题,一般都可以考虑回溯法. 当遇到一个可以用到回溯法的时候需要按照如下步骤进行: 1.确定问题一个可以用到回溯法的时候需要按照如下步骤进行: 1 ...
- 递归回溯法求数独全部解
项目介绍 QT5做的数独求解程序,可以判断数独解的个数(如果非唯一解). 运行截图 源码说明 使用MSVC + QT5平台,故* .cpp和* .h文件均采用UTF8 + BOM编码.如果切换到Min ...
- 回溯法 n皇后 python 解法一
输出所有解 global N N = 4def printSolution(board):for i in range(N):for j in range(N):print(board[i][j], ...
- 回溯法实例详解(转)
概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前 ...
- 回溯法 —— 判断子集和问题是否存在解
判断子集和问题是否存在解 分析思路: 采用回溯法针对问题存在解时求出相应的一个或多个解,或者最优解.如果需要判断问题是否存在解(一个或者多个),可以将求解函数改为bool型,当找到任何一个解时返回tr ...
- 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法
算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...
- 用回溯法求子集和的c++代码
用回溯算法解决问题的一般步骤为: 一.定义一个解空间,它包含问题的解. 二.利用适于搜索的方法组织解空间. 三.利用深度优先法搜索解空间. 四.利用限界函数避免移动到不可能产生解的子空间. 问题的解空 ...
- [回溯法] 和尚挑水问题-华为笔试
某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; ...
最新文章
- oracle 操作树大全,oracle树查询语句
- 前端学习(2082):const得使用和注意点
- 考教育统计与测量可以带哪种计算机,《教育统计与测量》练习题库及答案
- jsonrpc aria2_抛弃迅雷,Aria2 新手入门
- 基于XMPP协议的Android即时通信系
- R语言爱好者必备——R语言速查表(高清版可下载)
- excel-按条件向下填充
- 惠普计算机X9W2AV参数,MAX220CPE,MAX220CPE pdf中文资料,MAX220CPE引脚图,MAX220CPE电路-Datasheet-电子工程世界...
- 自然之州阿肯色及温泉国家公园
- valgrind内存泄漏检测
- [财务][数据化分析][财务背景知识][财务三张基础表][资产负债表][利润表][现金流量表]看懂财务三张表,以后看表再也不求人了...
- 论文笔记:主干网络——DenseNet
- ios 图标的配置
- 华为机试python打印机_华为校园招聘上机笔试题 扑克牌大小(python)
- 高薪诚聘中高级软件工程师
- 管理学一些常用定律(转)
- (java编程)输出1000以内的所有质数
- 720P、1080P、4K之间有什么区别和联系?
- 云服务器打不开,为什么打不开云服务器失败怎么回事
- 第六、七章 嵌入式Linux开发
热门文章
- AAAI 2020 Reasoning with Heterogeneous Graph Alignment for Video Question Answering∗
- 如何判断车与路边线距离_教你如何判断车身与边线的距离?一看就懂
- LineString (JTS)
- linux yum iso镜像文件,linux yum配置本地iso镜像
- 如何做好互联网营销?
- [Tomcat,Servlet]解决罕见情况导致的错误javax.servlet.ServletException: Error instantiating servlet class
- android visibility动画,android – 动画和setVisibility
- 无聊猿如何成了「元宇宙」的基础?
- Android_(传感器)获取手机中的传感器
- 再反转:21℃室温超导成果被美院士宣称复现!新实验基于原始样品,南大闻海虎再提3点质疑...