import java.util.*;

public class Solution {
    boolean[] marked;
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        //存储总的返回结果
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        //存合法全排列
        LinkedList<Integer>  track = new LinkedList<>();
        
        marked = new boolean[num.length];
        //排序
        Arrays.sort(num);
        backtrack(num, result,track);
        return result;
    }
    
    public void backtrack(int[] num, ArrayList<ArrayList<Integer>> result, LinkedList<Integer> track){
        if(track.size() == num.length){
            //一个全排列
            result.add(new ArrayList<Integer>(track));
            return;
        }
        for(int i = 0;i< num.length;i++){
            //1.marked[i] 当前位置访问过
            //2.回溯的时候,相同的数字有没有用过,如何判断
            // 从n-1位回溯到n-2,此时marked[n-2]和marked[n-1] 会变成false,然后i = n-1继续遍历,此时marked[n-2]是false
            //试想一下,从第0位开始,递归的时候,会出现num[i] == num[i-1]并且marked[i-1] = false吗?不会
            if( (i > 0 && num[i] == num[i-1] && !marked[i-1]) || marked[i]){
                continue;
            }
            track.add(num[i]);
            //已经访问过了
            marked[i] = true;
            //寻找下一个 数据
            backtrack(num, result, track);
            //回溯 最后一个数删除
            track.removeLast();
            //每一次排列 都需要重置再来
            marked[i] = false;
        }

    }
}