本文内容来自于代码随想录https://www.programmercarl.com/
思想
一棵树中的纵向遍历结束回到上一层的过程,比如:
这个过程通常回伴随恢复现场的过程。
模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果(也叫做恢复现场)
}
}
去掉重复方案
- 需要对数组排序Arrays.sort(nums);
- 对同一层的数据进行去重if (i > 0 && nums[i] == nums[i - 1] && !st[i - 1]) continue;
优化
在回溯算法中,通常通过剪枝操作进行优化。
判断是否符合条件
一般是在 for 循环内部去判断,当前要递归的元素是否符合条件。比如,
- 在 N 皇后问题中,当前递归的元素是不是能够放在这里
- 在复原 IP 地址中,当前递归的元素是否有前导 0,是否满足 >= 0 && <= 255 的条件