# 47. Permutations II
###### tags: `C++` `LeetCode` `Medium` `Backtracking`
## Notes
```
不能有重複的組合出現
所以在一開始先對陣列做排序
讓陣列由小到大
讓相同的數字聚集在一起
相同的數字聚集在一起之後
每一輪 (每一次進行 backtrack)
只能選一次這個數字
因為同一輪選出來的數字會在相同的位置
如果有兩個相同的數字被選上
就一定會有重複的組合
Backtrack
def backtrack(route, decisions)
if terminal condition satisfied
result.add(route)
return
for decision in disision list
make decision <- 這裡不能做出重複的 decision
backtrack(route, decision lists)
withdraw decision
```
## Code
```c++
#include <vector>
#include <climits>
#include <algorithm>
#include "cout.h"
vector<vector<int>> permuteUnique(vector<int>& nums);
vector<vector<int>> permuteBacktrack(vector<int>& nums, vector<int> used, vector<int> result, vector<vector<int>> &results);
int main()
{
vector<int> v = {1, 1, 2};
coutVectorVector(permute(v));
return 0;
}
vector<vector<int>> permuteUnique(vector<int>& nums)
{
vector<vector<int>> results;
vector<int> result;
vector<int> used;
int len = nums.size();
sort(nums.begin(), nums.end());
used.assign(len, 0);
results = permuteBacktrack(nums, used, result, results);
return results;
}
vector<vector<int>> permuteBacktrack(vector<int>& nums, vector<int> used, vector<int> result, vector<vector<int>> &results)
{
int len = nums.size();
int lastNum = INT_MAX;
if(result.size() == nums.size()) results.push_back(result);
for(int i = 0; i < len; i++)
{
if(used[i] == 0 && lastNum != nums[i])
{
used[i] = 1;
result.push_back(nums[i]);
permuteBacktrack(nums, used, result, results);
used[i] = 0;
result.pop_back();
lastNum = nums[i];
}
}
return results;
}
```