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]
.
思路:这道题可以用递归的方式求解,先获得所有的数字(唯一的),然后统计这些数字的频次,递归中判断频次是否大于0,是则为位置Pos的值,不是
则获得下一个数字。
class Solution {
private:
vector<int> f;
map<int,int> unique;
vector<vector<int> > res;
public:
void permuteUnique(int n, int k) {
if (k == n)
{
res.push_back(f);
}
else {
map<int,int>::iterator it;
for(it=unique.begin(); it!=unique.end(); ++it)
{
if(it->second > 0)
{
it->second--;
f[k] = it->first;
permuteUnique(n,k+1);
it->second++;
}
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num)
{
if(num.empty()) {
return res;
}
int len = num.size();
f.resize(len);
int i,j;
for(i=0; i<len; ++i)
{
if(unique.find(num[i]) != unique.end())
{
unique[num[i]]++;
}
else
{
unique.insert(pair<int,int>(num[i],1));
}
}
permuteUnique(len,0);
return res;
}
};