
求解代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
public ArrayList<ArrayList<Integer>> permute (int[] num) {
ArrayList<Integer> track = new ArrayList<>();
boolean[] used = new boolean[num.length];
backtrack(num,track,used);
return ans;
}
private void backtrack(int[] num,ArrayList<Integer> track,boolean[] used){
if(track.size()==num.length){
ans.add(new ArrayList<>(track));
return;
}
for(int i=0;i<num.length;i++){
if(used[i]){
continue;
}
track.add(num[i]);
used[i]=true;
backtrack(num,track,used);
track.remove(track.size()-1);
used[i]=false;
}
}
|
小贴士
回溯的核心是状态回退,也就是递归深入时修改的状态(比如本题的track、used),递归返回时必须恢复原状,只有这样才能保证下一轮循环的选择是干净的。