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] ]
类似46题,求一个数组的所有排列,但这里的数可能出现重复,排列要求不能重复。在46题的代码进行小小的修改,要保证排列不重复,则要保证开头的数不重复,然后递归求子数组的全排列。
代码:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
permute_helper(nums, 0, res);
return res;
}
private:
void permute_helper(vector<int>& nums, int l, vector<vector<int>>&res) {
if(l == nums.size()-1) {
res.push_back(nums);
return;
}
unordered_set<int> numSet;
for(int i = l; i < nums.size(); ++i) {
if(numSet.find(nums[i]) != numSet.end()) {
continue;
}
numSet.insert(nums[i]);
swap(nums[l], nums[i]);
permute_helper(nums, l+1, res);
swap(nums[l], nums[i]);
}
}
};