题目要求:给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1],
[3,1,2], [3,2,1] ]
思路如下:
1、全排列需要遍历所有元素得出所有方案,可以考虑DFS+回溯的思路解题
2、需要注意的是
list.add(new ArrayList<>(sublist));
为什么不是
list.add(sublist);
这是因为,sublist只是一个引用,最后会指向sublist所在的对象空间,而回溯之后
回到了根节点,而根节点已经为空,因此需要拷贝一份sublist。
class Solution {
List<List<Integer>> list=new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
if(nums.length==0){
return list;
}
helper(nums,list,new ArrayList<>());
return list;
}
public void helper(int []nums,List<List<Integer>> list,List<Integer>sublist){
if(sublist.size()==nums.length){
list.add(new ArrayList<>(sublist));
return;
}
for(int i=0;i<nums.length;i++){
if(sublist.contains(nums[i])){
continue;
}
sublist.add(nums[i]);
helper(nums,list,sublist);
sublist.remove(sublist.size()-1);
}
}
}
原题地址:
46.全排列