参考链接:点击跳转
关键概念:路径、选择列表、结束条件
-
路径:也就是已经做出的选择。
-
选择列表:也就是你当前可以做的选择。
-
结束条件:也就是到达决策树底层,无法再做选择的条件。
套路:
result = []
public void backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return;
for 遍历选择列表:
(可以进行剪枝筛选)
做选择
backtrack(路径, 选择列表)
撤销选择
例子1:含重复数字的全排列
class Solution {
List<List<Integer>> result = new LinkedList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> temp = new LinkedList<>();
permute(nums, 0, temp);
return result;
}
public void permute(int[] nums, int index, List<Integer> temp){
if(temp.size() == nums.length){//结束条件
result.add(new LinkedList(temp));
return;
}
Set<Integer> set = new HashSet<>();
for(int i = index; i < nums.length; i++){//遍历选择列表
if(set.contains(nums[i])){//进行剪枝,去除同一位置的重复数字
continue;
}else{
set.add(nums[i]);
}
swap(nums, i, index);//利用交换遍历所有的选择列表
temp.add(nums[index]);
permute(nums, index + 1, temp);
swap(nums, i, index);
temp.remove(temp.size() - 1);
}
}
public void swap(int[] nums, int m, int n){
int temp = nums[m];
nums[m] = nums[n];
nums[n] = temp;
}
}