47. Permutations II
Question
Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.
Example 1:
Input: nums = [1,1,2]
Output:
[[1,1,2],
[1,2,1],
[2,1,1]]
Example 2:
`` Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
**Constraints:**
+ 1 <= nums.length <= 8
+ -10 <= nums[i] <= 10
---
---
### Summary
It is easy to come up an idea of `dfs` with `recursion` strategy.
If there is only one num in vector, add it into result;
If there are two nums in vector, compute all permutations of the last num, and add the first num into different postion of the each permutation.
---
---
### Solution
```cpp
class Solution {
public:
set<vector<int>> result;
vector<vector<int>> permuteUnique(vector<int>& nums) {
result.clear();
sort(nums.begin(), nums.end());
dfs(nums);
return vector<vector<int>>(result.begin(), result.end());
}
void dfs(const vector<int> vec){
if (vec.size()==1){
result.insert(vec);
return;
}
int num = vec[0];
dfs(vector<int>(vec.begin()+1, vec.end()));
set<vector<int>> tmp = result;
result.clear();
for(auto permutation : tmp) {
for(int i=0; i<=permutation.size(); i++) {
vector<int> candidate = permutation;
candidate.insert(candidate.begin()+i, num);
result.insert(candidate);
}
}
}
};