回溯算法理论基础
回溯是递归的副产品,只要有递归就会有回溯。
因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。
那么既然回溯法并不高效为什么还要用它呢?
因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。
77. 组合
思路:
每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。
代码实现
var combine = function (n, k) {
let result = [];
let path = [];
const backTracking = (n, k, startIndex) => {
if (path.length === k) {
result.push([...path]);
return;
}
for (let i = startIndex; i <= n - (k - path.length) + 1; i++) {
path.push(i);
backTracking(n, k, i + 1);
path.pop();
}
}
backTracking(n, k, 1);
return result
};
总结:
在二叉树学习的时候 就已经接触过回溯了 主要是用来解决 多次for循环的问题 但是还是不太好理解 尤其是剪枝操作 回溯就是递归 确定好递归三要素就容易许多