46、给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
解题:
运用树的遍历过程选定数字,得到整个数组的全排列
/**
* 全排列问题
*/
class Quanpailie {
public List<List<Integer>> permute(int[] nums) {
int len = nums.length;
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(len==0){
return res;
}
//定义全排列的状态
//一个栈用来记录已选的数字、一个boolean数组记录是否使用,depth常量记录层数
Deque<Integer> path = new ArrayDeque<>();
boolean[] used = new boolean[len];
dfs(nums,len,0,path,used,res);
return res;
}
public void dfs(int[] nums,int len,int depth,Deque<Integer> path,boolean[] used,List<List<Integer>> res){
//如果当前层数==数组长度,说明已经是叶子节点
if(depth==len){
res.add(new ArrayList<>(path));
return;
}
//遍历数组,从未选择的地方开始接着往下dfs,之后回溯
for(int i=0;i<len;i++){
if(used[i]){
continue;
}
//这部分相当于是在回溯
path.addLast(nums[i]);
used[i]=true;
dfs(nums,len,depth+1,path,used,res);
used[i] = false;
path.removeLast();
}
}
public static void main(String [] args){
int[] nums = {5,6,7};
Quanpailie q = new Quanpailie();
List<List<Integer>> res = q.permute(nums);
System.out.println(res);
}
}