class Solution { public: void recursion(vector<int>& num, vector<vector<int>>& ans, vector<int>& vis, vector<int>& tmp) { if (tmp.size() == num.size()) { // 已得到一个结果 ans.push_back(tmp); return; } // 遍历所有元素 选取加入 for(int i=0; i<num.size(); ++i) { if(vis[i]) continue; // 若该元素被加入 标记过 就跳过 if(i>0 && num[i] == num[i-1] && vis[i-1]) // 注意这里的标记数组 两种都对 !vis[i-1] { // 和上个元素相同 且上一个已经使用过 跳过 continue; } vis[i] = 1; // 标记 tmp.push_back(num[i]); // 进入下一层 recursion(num, ans, vis, tmp); // 回溯 vis[i] = 0; tmp.pop_back(); } } vector<vector<int> > permuteUnique(vector<int>& num) { int n = num.size(); // 标记数组 vector<int> vis(n, 0); sort(num.begin(), num.end()); vector<vector<int>> ans; vector<int> tmp; // 用于存储每个可能排序的数组 // 递归函数 recursion(num, ans, vis, tmp); return ans; } };
使用标记数组