题目:Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
比上一题难再要去掉重复数字带来的排列,但也只要在处理一个数时判断这个数是否跟之前的重复就行了。
void mswap(int &a, int &b)
{
int tmp=a;
a=b;
b=tmp;
}
vector<vector<int> > res;
void rankcharat(vector<int> input, int begin, int end)
{
if(input.size()<1) return ;
if(begin == end)
{
vector<int> str;
for(int j=0; j<=end; j++)
str.push_back(input[j]);
res.push_back(str);
return;
}
for(int i=begin; i<=end; i++)
{
bool flag=true;
for(int j=i-1; j>=begin; j--) //增加这个判断这个数是否跟之前的重复
if(input[i]==input[j])
{flag=false;break;};
if(flag)
{
mswap(input[begin], input[i]);
rankcharat(input, begin+1, end);
mswap(input[begin], input[i]);
}
}
return ;
}
vector<vector<int> > permuteUnique(vector<int> &num)
{
rankcharat(num , 0, num.size()-1);
return res;
}