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

 京公网安备 11010502036488号
京公网安备 11010502036488号