回溯:
-
特点:
-
递归是向前,回溯就是需要考虑后退,它是一种搜索的方式;
-
类似于暴力搜索 + 剪支【提高效率】;
- 减支,是优化的唯一方式;
-
集合的大小构成了树的宽度,递归的深度构成了树的深度;
for循环树的宽度,递归树的深度【多叉树】;
- 变量【宽度、深度】
在每一次的迭代中确定子树的宽度【去重问题】
-
-
经典题型:
-
组合问题:
-
组合是没有顺序的,所以一定会传入一个下标,来限制访问已经访问过的【结果去重】
-
去重问题:
-
结果去重【无顺序】:不能访问已经访问过的数据【传入下标【i or i++】,i不能减小】;
-
数据去重【输入有重复】:重新排序,
- 当元素可重复的时,传入下标不变【i 】;
总结:对同一树枝去重,是元素去重,【通过标记法】
对同一树层去重,是结果去重;【通过下标i】
对于唯一解,不需要进行树层的去重【最佳行程】
-
-
-
排列问题;
-
分割,子集;
总结:组合 + 分割问题【收集树的叶子节点】
子集问题【找到树的所有节点】
-
棋盘问题【偏向于深度优先搜索,最佳结果唯一】:
- 最佳行程【解决优先问题】
- N皇后【对于树宽,树深】
- 数独【二维递归】
回溯是暴力解法,模板较为固定【通常会超时】
-