目录
什么是回溯?
回溯:你处理了之后,再进行”撤销“处理,”撤销“这个动作就是回溯。
回溯常用来解决什么问题?
1.棋盘问题
2.路径搜索问题
3.组合问题
4.排列问题
5.子集问题
回溯的效率如何?
很差很差,相当于是暴力方法,因为它会尝试每一个可能。
回溯在面试中的考察频率
很高,在笔试中也很高。可以用回溯解决,但是拿不到100%的分数,可能可以拿33%或者66%。
组合问题和排列问题考的比较多。
如何学好回溯?
学好了递归也就学好了回溯。
一定不能陷入细节,宁愿不求甚解。先会做,再慢慢研究细节。之后就是做题,会做大量的题,大概15+。
回溯通用模板
void backtrace(参数){
//结束条件:没有路可以走了,也就是没有元素可以选择了;或者说找到目标了。
if(判断是否结束){
return;
}
for(从多个可选元素中选一个进行回溯){
//选了其中一个元素进行处理,相当于做标记
结果集.add(被选中的元素)
backtrace(被选中的元素);
//撤销处理
结果集.remove(被选中的元素)
}
}
在刷过题后再看这个模板会觉得很清晰明了,但回溯问题一般都比较难,单纯套模板也不是那么容易的。让我们一起加油吧。