import java.util.*;
public class Solution {
    
    ArrayList<ArrayList<Integer>> ret;
    ArrayList<Integer> path;
    boolean[] check;

    public ArrayList<ArrayList<Integer>> permuteUnique (int[] num) {
        ret = new ArrayList<ArrayList<Integer>>();
        Arrays.sort(num);
        path = new ArrayList<Integer>();
        check = new boolean[num.length];
        dfc(num);

        return ret;
    }

    public void dfc(int[]num){

        //终止条件
        if(num.length==path.size()){
		  //没有该全排列时再加入
            if(!ret.contains(new ArrayList<>(path))){
                ret.add(new ArrayList<>(path));
            }
            
            return;
        }

        for(int i=0;i<num.length;i++){
            //当没有加入过该节点时
            if(check[i]==false){
                //加入
                path.add(num[i]);
                check[i] = true;
                //进入下一层加入
                dfc(num);
                //到最后回溯
                check[i] = false;
                path.remove(path.size()-1);
            }
        }
    }

}