class Solution {
public:
    /**
      * 从数组num中挑选一个数放入item中
      * 标记该位置被使用arrIsUser[i] = 1;
      * 在递归从剩余数中选择加入到item
      * 同时set插入该数表示不能再插入同样数字到item当前位置
      * item.size() == num.size() 一组排列
      */
    void dfs(vector<vector<int>> &res, vector<int> &num, vector<int> &item, vector<int> &arrIsUser) {
        if (item.size() == num.size()) {
            res.push_back(item);
            return;
        }
        // 记录当前层已经使用过的数
        set<int> check;
        for(int i = 0; i < num.size(); i++) {
            if (check.find(num[i]) != check.end() || arrIsUser[i]) continue;
            check.insert(num[i]); // 插入
            arrIsUser[i] = 1;
            item.push_back(num[i]);
            dfs(res, num, item, arrIsUser);
            arrIsUser[i] = 0;
            // check.erase(num[i]); // 删除
            item.pop_back();
        }
    }
    vector<vector<int> > permuteUnique(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int>> res;
        vector<int> item;
        vector<int> arrIsUser(num.size(), 0);
        dfs(res, num, item, arrIsUser);
        return res;
    }
};
static const auto io_sync_off = []() { //lambda函数
    // turn off sync,关闭输入输出流的缓存
    std::ios::sync_with_stdio(false);
    // untie in/out streams,实现输入和输出流的解绑
    std::cin.tie(nullptr);
    return nullptr;
}
();