一、问题描述
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], [2,1,1] ]
二、思路
思路和Permutations类似,不同的是,由于有重复元素,我们先对数组进行排序,这样可以保证重复元素相邻,然后在for循环中添加
if(begin != i && nums[i] == nums[begin]) continue;
作用是去除掉重复排列情况。还有就是我们在求出下一个全排列后,不需要交换回来,即没有增加交换。
三、代码
class Solution {
public:
void AllRange(vector<int> nums, int begin,int end, vector<vector<int>> &v){
if(begin == end - 1){
v.push_back(nums);
return;
}else{
for(int i = begin; i < end; ++i){
if(begin != i && nums[i] == nums[begin]) continue;
swap(nums[begin], nums[i]);
AllRange(nums, begin + 1, end, v);
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> v;
sort(nums.begin(), nums.end());
AllRange(nums,0,nums.size(),v);
return v;
}
};