#include <unordered_set>
#include <vector>
class Solution {
public:
    void dfs(vector<vector<int>> & ans, vector<bool> vis, vector<int> temp, vector<int> num, int n){
        if(n == temp.size()){//退出窗口
            ans.push_back(temp);
        }

        for(int i = 0; i < n; i++){
            if(vis[i]) continue;
            if(i > 0 && num[i] == num[i - 1] && !vis[i - 1]) continue;//这里的!vis[i - 1]是最关键的,如果前一个位置未访问并且与前一个数相等,则表示这种情况有重复,而当vis[i - 1]为真表示,当前元素并不是主要元素
            temp.push_back(num[i]);
            vis[i]  = true;
            dfs(ans, vis, temp, num, n); //相当于往下走,进行更小型数组的递归
            //本层分支,其他情况的的处理,也就是回溯
            vis[i] = false;
            temp.pop_back();
        }
    }
    vector<vector<int> > permuteUnique(vector<int>& num) {
            sort(num.begin(), num.end());
            int n = num.size();
            vector<vector<int>> ans;
            vector<int> temp;
            if(n == 0) return ans;
            vector<bool> vis(n, false);
            dfs(ans, vis, temp, num, n);

            return ans;
       
    }
};