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:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> all;
map<int,bool> visited;//记录以num[i]开头的组合是否已经计算过
for(size_t i=0;i<num.size();++i){
if(visited[num[i]]) continue;
visited[num[i]]=true;
vector<int> restCopy(num.begin(),num.end());
restCopy.erase(restCopy.begin()+i);
vector<vector<int>> rest = permuteUnique(restCopy);
if(rest.size()){
for(size_t j=0;j<rest.size();++j){
vector<int> &each = rest[j];
each.insert(each.begin(),num[i]);
all.push_back(each);
}
}else{
all.push_back(num);
}
}
return all;
}
};