# 全排列 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]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
以下错误的选项是?
## 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;
}
};
```