回溯算法总结
模板:
result[];
public void backtrack(路径,选择表){
if(满足结束条件){
result.add(路径);
return;
}
for(选择:选择表){
做选择;
backtrack(路径,选择表);
撤销选择;
}
}
力扣56 全排列
class Solution {
private List<List<Integer>>res=new ArrayList<>();//结果声明为全局变量可以减少方法里的参数
private boolean[] used;
public List<List<Integer>> permute(int[] nums) {
List<Integer> path=new ArrayList<>();
used=new boolean[nums.length];
backtrack(path,nums);
return res;
}
public void backtrack(List<Integer> path,int[] nums){
if(path.size()==nums.length){
res.add(new ArrayList(path));//这里要注意,如果用res.add(path),则结果为空。
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue;
path.add(nums[i]);
used[i]=true;
backtrack(path,nums);
path.remove(path.size()-1);
used[i]=false;
}
}
}