Day 2:全排列与子集生成(掌握回溯模板)
📖 一、回溯算法简介
回溯算法(Backtracking Algorithm)是一种通过试探法(递归)来找出所有解法的算法。它是深度优先搜索(DFS)的一个特殊形式。在回溯过程中,我们会不断地选择并尝试每一个可能的解,当发现当前选择不合适时,我们会回退到上一步并尝试其他选项,这就是“回溯”的意义。
回溯算法的核心思想:
- 递归构建解空间树:将问题的解空间表示为树状结构,每一层代表一个选择。
- 剪枝:在递归过程中,通过判断是否满足某些条件来避免不必要的搜索,减少计算量。
- 回溯:当搜索到某个节点时,判断当前路径是否满足目标,如果不满足目标,则“回溯”到上一步进行其他尝试。
回溯算法的模板:
public class Backtracking {
public void backtrack(List<Integer> tempList, List<List<Integer>> result, int[] nums, int start) {
// 记录当前选择的路径
result.add(new ArrayList<>(tempList));
// 从当前位置开始,尝试选择每个元素
for (int i = start; i < nums.length; i++) {
// 做选择
tempList.add(nums[i]);
// 递归进入下一层
backtrack(tempList, result, nums, i + 1);
// 撤销选择
tempList.remove(tempList.size() - 1);
}
}
}