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]
.
之前在算法竞赛那本书上有这样的题目,按照那种思路,代码按照题目格式以及自己的喜好写了下,可能有点乱:
class Solution {
public:
void permutation_print(vector<int> &num,vector<int> &oneRes,vector<int> &vis,vector<vector<int> > &res,int cur)
{
if(cur==num.size())//递归返回边界
{
if(oneRes.size()>0)
res.push_back(oneRes);
return ;
}
else
{
int used,flag=0;//
for(int i=0; i<num.size(); i++)
{
if(vis[i]==0 && (flag==0||num[i]!=used))//保证既不重复,也不会{1,1,1}这样的没有输出
{
oneRes.push_back(num[i]);
vis[i]=1;
used=num[i];
flag=1;
permutation_print(num,oneRes,vis,res,cur+1);//递归调用
oneRes.erase(oneRes.begin()+cur);//恢复状态
vis[i]=0;<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">//恢复状态</span>
}
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<int> vis,oneRes;
vector<vector<int> > res;
vis.insert(vis.end(),num.size(),0);//初始化访问数组
sort(num.begin(),num.end());//一定要先进行排序
permutation_print(num,oneRes,vis,res,0);
return res;
}
};