题目:leetcode
Permutations II
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]
.
分析:
1、记录输入数组中每个元素出现的次数,将该记录(pait<int,int>类型)放在数组n里。
2、每次递归,从n的第一个元素开始遍历:若该元素代表的数字在path中出现的次数少于上限,则可以往path里加入一个该数字;若该元素代表的数字在path中出现的次数等于上限,则该数字不能再放入path了,此时查看数组n的下一个元素。
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num)
{
vector<vector<int> > res;
if(num.empty())
return res;
map<int,int> t;
for(auto &i:num)
{
t[i]++;
}
vector<pair<int,int>> n;
for(auto &i:t)
{
n.push_back(i);
}
int size=num.size();
vector<int> path(size);
permuteUnique_core(n,0,path,res);
return res;
}
void permuteUnique_core(vector<pair<int,int>> &n,int index,vector<int> &path,vector<vector<int> > &res)
{
if(index==path.size())
{
res.push_back(path);
return;
}
for(int i=0;i<n.size();i++)
{
int count=0;
for(int j=0;j<index;j++)
{
if(path[j]==n[i].first)
count++;
}
if(count<n[i].second)
{
path[index]=n[i].first;
permuteUnique_core(n,index+1,path,res);
}
}
}
};