Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
if(!nums.size())
return vector<vector<int> >();
std::sort(nums.begin(),nums.end());
bool visited[nums.size()] = {false};
vector<vector<int> > res;
vector<int> temp;
permutation(temp, nums, visited, res);
return res;
}
void permutation(vector<int> &temp, vector<int> &nums, bool visited[], vector<vector<int> > &res)
{
if(temp.size()==nums.size())
{
res.push_back(temp);
}else
{
for(int i=0; i<nums.size(); i++)
{
if(i>0&&nums[i]==nums[i-1]&&!visited[i-1])
continue;
if(!visited[i])
{
visited[i] = true;
temp.push_back(nums[i]);
permutation(temp, nums, visited, res);
temp.pop_back();
visited[i] = false;
}
}
}
}
};