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].
这个题跟Permutations非常像,解题方法也是仅仅加了几句,我是直接copy上题的第二种解法,稍微修改了一下,加了一个set容器,用处处理重复元素,代码如下:(后面加双斜线的内容为修改的地方,其他地方都没变)
void perm(vector<vector<int>> &res,vector<int> &nums,int k){
if(k==nums.size()-1){
res.push_back(nums);
return;
}else{
set<int> flag;//
perm(res,nums,k+1);
flag.insert(nums[k]);//
for(int i=k+1;i<nums.size();i++){
if(flag.find(nums[i])!=flag.end())continue;//
flag.insert(nums[i]);//
swap(nums[k],nums[i]);
perm(res,nums,k+1);
swap(nums[k],nums[i]);
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
perm(res,nums,0);
return res;
}
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}