回溯
isused标记元素是否已经被选取过了
depth 表示新排列中的第几个元素 从0开始
path 双端队列实现 新的排列数据 不断加入 , 满足条件加入结果集合 ,再回溯遍历其他可能
public class Solution {
public ArrayList<ArrayList<Integer>> permute(int[] num) {
int len = num.length;
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(len == 0){
return res;
}
Deque<Integer> path = new LinkedList<Integer>();
boolean[] isUseds = new boolean[len];
dfs(num,isUseds,0,path,res);
return res;
}
public void dfs(int[] nums,boolean[] isUseds, int depth,Deque<Integer> path,ArrayList<ArrayList<Integer>> res){
int len = nums.length;
if(path.size() == len){
res.add(new ArrayList<Integer>(path));
return;
}
for(int i=0;i<len;i++){
int num = nums[i];
if(isUseds[i]) continue;
path.add(num);
isUseds[i] = true;
dfs(nums,isUseds,depth+1,path,res);
isUseds[i]= false;
path.removeLast();
}
}
}