回溯法理论基础
什么是回溯法: 回溯法和递归都是相辅相成的,回溯法一般隐藏在递归的下面。
回溯解决哪些问题: 回溯法是一个纯暴力的搜索法,可以解决组合问题、切割问题、子集问题、排列问题、棋盘问题(N皇后、解数独)。回溯法是特别抽象的,可以把回溯法理解成一个图形结构(树状图),一般来说这棵树的宽度就是我们要处理集合的大小,纵轴方向就是递归来处理的。
回溯模板:
let backtrenking = function(){
if(终止条件){
// 收集结果
return;
}
for(...){ // 这里遍历的是集合的元素集
// 处理节点
// 递归
// 回溯
}
}
题一:组合
题目链接: 组合
解题思路: 将组合问题抽象成一个树状的结构,设定一个path,用来记录单个结果,设定一个result,用来存放结果集,定好回溯三部曲,利用回溯模板,主要思路就是,当path的length等于给定的k的大小时就把path放入result,并return到上一步,return之后就是回溯了,过程有点复杂,三言两语说不清楚,还是对着代码好理解些。
解题代码:
var combine = function(n, k) {
let path = [];
var result = [];
var backtrenking = function(n,k,stackIndex){
if(path.length === k){
let temp = JSON.parse(JSON.stringify(path));
result.push(temp);
return;
}
for(let i = stackIndex; i <=n;i++){
path.push(i);
backtrenking(n,k,i+1);
path.pop(i);
}
}
backtrenking(n,k,1);
return result;
};