理论基础
- 是递归的副产品,回溯法 == 回溯搜索法,是本质为穷举的纯暴力搜索法(可以加剪枝)
- 可以解决的问题:
- 组合问题,N个数里面按一定规则找出k个数的集合
- 切割问题,一个字符串按一定规律有几种切割方式
- 子集问题,一个N个数的集合里有多少中符合条件的子集
- 排列问题,N个数按一定规则全排列,有几种排列方式
- 棋盘问题,N皇后,解数独
- PS:组合不强调元素顺序,排列强调元素顺序
- 如何理解回溯法:
- 画图理解,抽象为树形结构
- 数的宽度(for遍历)–>集合大小;
- 树的深度(递归遍历)–>
- 函数:
void backtracking(参数)
,参数很多,可能要一边写一边确定 - 终止条件:
if(终止条件){ //在叶子节点收集结果 return; }
- 单层搜索逻辑
for(集合的元素集){ //处理节点 backtracking(参数)//递归函数 //回溯操作,撤销处理节点 }
77.组合
- 照着模板很好写,递归+回溯