class Solution {
    private int n;
    private List ls;
    private boolean[] bool;
    private LinkedList path;
    public List> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        n = nums.length;
        ls = new ArrayList();
        path = new LinkedList();
        bool = new boolean[n];
        dfs(nums, 0);
        return ls;
    }
    private void dfs(int[] nums, int u) {
        if (u == n) {
            ls.add(path.clone());
            return;
        }
        for (int i = 0; i < n; i++) {
            if (!bool[i]) {
                if (i >= 1 && nums[i] == nums[i - 1] && bool[i - 1] == false)    // if bool[i-1] ==true 的话 选择i位置 即可以满足条件 1
                                                                                 // 2 1 i-1的位置比i快选择 
                                                                                //如果i-1 还没选 而 在选i的时候 就可以直接跳出 说明已经重复选择i位置了
                    // 第n趟递归是要在第n个位置选择一个数放置
                    // num[i-1]会比nums[i]早被考虑放到当前位置上
                    // 若bool[i-1]=false说明这个数在上一个排列中已经在这个位置放置过了
                    // 所以当前位置不应该再放置与nums[i-1]相等的nums[i] 
                    continue;
                path.add(nums[i]);
                bool[i] = true;
                dfs(nums, u + 1);
                bool[i] = false;
                path.removeLast();
            }
        }
    }
}