3.15 回溯法(解决排列组合,子集问题)

1.1
核心思想:当一种可能情况不成立时,往前回退一步
1.2 模板

1 //一定要分成横纵两个方面思考回溯
2 void backtracking(参数) {
3 if (终止条件) {
4 存放结果;
5 return;
6 }
7
8 for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {//注意i=0,i=start的区别
9 处理节点;
10 backtracking(路径,选择列表); // 递归 注意(i)和(i++)的区别 后面会懂
11 回溯,撤销处理结果

1.3 图形理解

1.4 例题
import java.util.ArrayList;
import java.util.List;

public class Permutations {
public List<List> permute(int[] nums) {
List<List> result = new ArrayList<>();
backtrack(nums, new ArrayList<>(), result);
return result;
}

private void backtrack(int[] nums, List path, List<List> result) {
// 终止条件:当路径长度等于数组长度时,说明找到了一个完整的排列
if (path.size() == nums.length) {
result.add(new ArrayList<>(path));
return;
}

// 遍历所有可能的选择
for (int i = 0; i < nums.length; i++) {
// 如果元素已经被使用过,则跳过
if (path.contains(nums[i])) {
continue;
}

// 做出选择
path.add(nums[i]);

// 递归调用
backtrack(nums, path, result);

// 撤销选择
path.remove(path.size() - 1);
}
}

}

posted @ 2025-03-15 23:51  Toby0919  阅读(30)  评论(0)    收藏  举报