给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
import java.util.ArrayList;
import java.util.List;
/*
先创建保存最终结果的res,再传入nums,depth,res,used,path,len
*/
public class Main {
public List<List<Integer>> permute(int[] nums){
int len=nums.length;
List<List<Integer>> res=new ArrayList<>();
//如果为0返回空数组
if(len==0){
return res;
}
//判断是否已经遍历过
boolean[] used=new boolean[len];
//path保存每一个全排列的结果,如[1,2,3]
List<Integer> path=new ArrayList<>();
//深度优先遍历
dfs(nums,res,used,0,len,path);
return res;
}
public void dfs(int[] nums,List<List<Integer>> res,boolean[] used,int depth,int len,List<Integer> path) {
//满足了深度条件,说明找到了一个结果
if(depth==len){
//使用拷贝函数,如果直接add(path),这是值传递,共用一个内存空间,最后答案不正确
res.add(new ArrayList<>(path));
return;
}
for(int i=0;i<len;i++){
//没有访问过
if(!used[i]){
//做选择加入元素,并且设置访问过
path.add(nums[i]);
used[i]=!used[i];
//进入下一层深度优先遍历
dfs(nums,res,used,depth+1,len,path);
//还原回未放问的状态,防止影响下一个for循环
used[i]=!used[i];
path.remove(path.size()-1);
}
}
}
public static void main(String[] args) {
int[] nums = {
1, 2, 3};
Main solution = new Main();
List<List<Integer>> lists = solution.permute(nums);
System.out.println(lists);
}
}