class Solution {
public:
    vector<vector<int>> ans;
    vector<int> temp;
    vector<int> used;
    vector<vector<int> > permuteUnique(vector<int>& num) { 
        sort(num.begin(), num.end());
        used = vector<int>(num.size(), 0);

        dp(num);

        return ans;
    }

    void dp(vector<int> &num){  
        //通过选取的方式,temp凑齐了个数既组织完毕一个情况,每一层既管理一位上取什么数;因为下层是下一位,取得数应该从头开始估量,
        //若数取过了,跳过;对于重复数,如果重复数使用了,说明上一层用的,这一层任然可以使用(不同位);
        //如果前一个重复数没有使用,则表示这一位重复书已经在同一位上使用过了,不能例举同一位的相同数
        if(temp.size() == num.size()){
            ans.push_back(temp);
            return;
        }

        for(int i=0; i<num.size(); ++i){   //排列,从0开始;
            if(used[i])continue;

            if(i>0 && num[i]==num[i-1] && !used[i-1])continue;

            temp.push_back(num[i]);
            used[i] = 1;
            dp(num);
            temp.pop_back();
            used[i] = 0;
        }
    }
};