描述:给定一个不含重复数字的数字nums,返回其所有的全排列,你可以按任意顺序返回答案。
import java.util.*;
public class 全排列 {
public List<List<Integer>> permute(int [] nums){
int len=nums.length;//定义len=数组的长度
Deque<Integer> path=new ArrayDeque<>();
List<List<Integer>> res=new ArrayList<>();
boolean[] used =new boolean[len];//将里面的数字都初始化为false,即最开始都没有被使用过
if(len ==0){
return res;
}
dfs(path,used,nums,res,0,len);//初始化层数为0
return res;
}
//Deque==>模拟栈,used==>前面的数字,判断前面的数字是否被使用过
//depth==>树的深度(层数),len==>数组的长度
private void dfs(Deque<Integer> path,boolean[] used,int[] nums,List<List<Integer>> res,int depth,int len){
if(depth == len){//如果递归的层数=数组的长度则结束
res.add(new ArrayList<>(path));//结束之前需要将已经组合好的全排列添加到数组中去
//因为每一个对应的都是不同的对象,所以需要new
return;//递归结束
}
for (int i = 0; i < len; i++) {//进行选择
if(!used[i]){//如果这个数没有被使用,则添加
path.addLast(nums[i]);//add()是将元素链接到队列尾部后,还返回true。
// addLast()只是将元素链接到队列尾部,不返回如何值
used[i]=true;//这个数已经被使用过了
dfs(path,used,nums,res,depth+1,len);//回溯,每次回溯层数+1,嵌套
//当dfs全部执行完后,开始清算
used[i]=false;//撤回选择
path.removeLast();//将对应的数字给删除
}
}
}
}