回溯

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();
        }
        
    }
    
    
}