目录
相关标签
一、题目要求
二、题解和代码
1.题解
2.实现代码
代码如下:
class Solution {
public List<List<Integer>> permute(int[] nums) {
// 使用一个动态数组保存所有可能的全排列
ArrayList<List<Integer>> res = new ArrayList<>();
//需要一个表示路径的变量 path,它是一个列表,特别地,path 是一个栈;
Deque<Integer> path = new ArrayDeque<Integer>();
//用于判断数组的元素有没有被使用,根据下标判断
boolean[] used = new boolean[nums.length];
perdfs(nums,nums.length,0,path,used,res);
return res;
}
/**
*
* @param num //要排序的数组
* @param len//数组长度
* @param depth//树的层数,当和len一样时说明已经拿到排序
* @param path//需要一个表示路径的变量
* @param used//用于判断数组的元素有没有被使用
* @param res//返回结果
*/
public void perdfs(int[] num ,int len,int depth,Deque<Integer> path,boolean[] used,List<List<Integer>> res){
// 递归终止条件是:path 的长度等于 len
if (depth == len){ //说明到了层数
res.add(new ArrayList<>(path));
return;
}
// 遍历可能的搜索起点
for (int i = 0; i <len ; i++) {
if (used[i]){//当成立,说明这个元素被存进了path,已经使用过了,跳过元素
continue;
}
// 向路径变量里添加一个数到末尾
path.addLast(num[i]);
used[i] =true;//把下标置为ture 表示已存储
// 下一轮搜索,设置的depth要加 1(表示进入下一层),因为组合数理不允许出现重复的元素
perdfs(num, len, depth+1, path,used, res);
//需要回溯,就是要把添加在末尾的弹出
path.removeLast();
//然后把该下标置为false ,表示已经弹出,可以给下一次使用
used[i] = false;
}
}
}