class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > res;
res.push_back(nums);
vector<int> backup=nums;
nextPermutation(nums);
while(nums!=backup)
{
res.push_back(nums);
nextPermutation(nums);
}
return res;
}
void nextPermutation(vector<int>& nums) {
for(int i=nums.size()-2;i>=0;i--)
{
if(nums[i]<nums[i+1])
{
int j;
for(j=nums.size()-1;j>i;j--)
if(nums[j]>nums[i])
break;
swap(nums[i],nums[j]);
reverse(nums.begin()+i+1,nums.end());
return;
}
}
reverse(nums.begin(),nums.end());
}
};
Updated version
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > res;
vector<int> set;
int size=nums.size();
set.push_back(nums[0]);
res.push_back(set);
for(int i=1;i<size;i++)
{
int pop_num=res.size();
for(int j=0;j<pop_num;j++)
{
set=res[0];
res.erase(res.begin());
set.insert(set.begin(),nums[i]);
res.push_back(set);
int start=0;
for(int k=1;k<set.size();k++)
{
if(set[start]!=set[k])
{
swap(set[start],set[k]);
res.push_back(set);
start=k;
}
else//here is the difference from Permutations I
break;
}
}
}
return res;
}
};