# 全排列 II

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

 

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2], [1,2,1], [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

 

提示:

以下错误的选项是?

## aop ### before ```c #include using namespace std; ``` ### after ```c int main() { Solution sol; vector nums = {1, 1, 2}; vector> res; res = sol.permuteUnique(nums); for (auto i : res) { for (auto j : i) cout << j << " "; cout << endl; } return 0; } ``` ## 答案 ```c class Solution { private: vector> result; vector path; void backtracking(vector &nums, vector &used) { if (path.size() == nums.size()) { result.push_back(path); return; } for (int i = 0; i < nums.size(); i++) { if (used[i] == false) { used[i] = true; path.push_back(nums[i]); backtracking(nums, used); path.pop_back(); used[i] = false; } } } public: vector> permuteUnique(vector &nums) { result.clear(); path.clear(); sort(nums.begin(), nums.end()); vector used(nums.size(), false); backtracking(nums, used); return result; } }; ``` ## 选项 ### A ```c class Solution { public: vector> permuteUnique(vector &nums) { vector> res; int n = nums.size(); vector temp; vector visited(n, false); sort(nums.begin(), nums.end()); backtrackpermuteUnique(0, n, nums, temp, res, visited); return res; } void backtrackpermuteUnique(int k, int n, vector nums, vector &temp, vector> &res, vector &visited) { if (k == n) { res.push_back(temp); return; } for (int i = 0; i < n; i++) { if (!visited[i]) { if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1]) continue; temp.push_back(nums[i]); visited[i] = true; backtrackpermuteUnique(k + 1, n, nums, temp, res, visited); temp.pop_back(); visited[i] = false; } } } }; ``` ### B ```c class Solution { public: vector> permuteUnique(vector &nums) { vector> res; vector used(nums.size()); sort(nums.begin(), nums.end()); dfs(nums, used, res); return res; } private: vector stack; void dfs(vector &nums, vector &used, vector> &res) { if (stack.size() == nums.size()) { res.push_back(stack); } else { for (int i = 0; i < nums.size(); i++) { if (!used[i]) { if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) { continue; } stack.push_back(nums[i]); used[i] = true; dfs(nums, used, res); stack.pop_back(); used[i] = false; } } } } }; ``` ### C ```c class Solution { public: vector> permuteUnique(vector &nums) { vector now_p; vector> all_p; vector> numCnt; sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size();) { int num = nums[i], cnt = 1; while (i + cnt < nums.size() && nums[i + cnt] == num) ++cnt; i += cnt; numCnt.emplace_back(num, cnt); } function generate; generate = [&generate, &nums, &numCnt, &now_p, &all_p](int index) { if (index == nums.size()) { all_p.push_back(now_p); return; } for (auto &i : numCnt) { if (i.second) { --i.second; now_p.emplace_back(i.first); generate(index + 1); now_p.pop_back(); ++i.second; } } }; generate(0); return all_p; } }; ```