给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
代码语言:javascript复制输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
回溯算法的套路
代码语言:javascript复制for 选择 in 选择列表:
# 做选择
将该选择从选择列表移除
路径.add(选择)
backtrack(路径, 选择列表)
# 撤销选择
路径.remove(选择)
将该选择再加入选择列表
于是我自己写的代码如下:
代码语言:javascript复制class Solution {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
LinkedList<Integer> path = new LinkedList();
boolean[] visted = new boolean[nums.length];
for(int i=0;i<visted.length;i ){
visted[i] = false;
}
backtrack(nums,path,visted);
return result;
}
private void backtrack(int[] nums , LinkedList<Integer> path,boolean[] visted){
for(int i=0; i<nums.length; i ){
if(path.size()==nums.length){
result.add(new LinkedList<Integer>(path));
return;
}
int value = nums[i];
if(visted[i]==true){
continue;
}
path.add(value);
visted[i] = true;
backtrack(nums,path,visted);
visted[i] = false;
path.removeLast();
}
}
}
关键一步是添加结果时,要重新创建list,result.add(new LinkedList(path)); 不能直接result.add(path),因为path后面会有撤回操作,会被移除里面的元素,导致结果不对