
java
class Solution {
//盛放所有的组合
List<List<Integer>> res = new ArrayList<>();
//盛放单个组合
List<Integer> path = new ArrayList<>();
//记录当前数字是否使用过
boolean[] used;
public List<List<Integer>> permute(int[] nums){
used = new boolean[nums.length];
backtrack(nums);
return res;
}
//回溯函数
private void backtrack(int[] nums){
//当前三个数组填满path,装入res
if(path.size() == nums.length){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i++){
//数字已经在盒子中,跳过
if(used[i]){
continue;
}
//将数字放入path中
path.add(nums[i]);
used[i] = true;
backtrack(nums);
//将数字取出来
path.remove(path.size() - 1);
used[i] = false;
}
}
}
这里必须new ArrayList<>(path),使用深拷贝;如果使用res.add(path),后续执行撤销操作的时候就会将已经存入到res中的结果改变了。