给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
思路:我们可以延续上一个的解法Permutation,只需要做一些细节的改动,由于题目要求必须返回不重复的全排列,所以可以把每次遍历到的结果放入set中,即建立一个set<vector<int>> res的数据类型即可。同时还可以做一些优化,比如当nums[i]和nums[left]相等时就不交换,这样可以节省时间。
参考代码如下:
class Solution {
public:
void permuteCore(vector<int>& nums,int start, set<vector<int>> &res) {
if (start == nums.size()) {
res.insert(nums);
}
for (int i = start; i < nums.size(); i++) {
if (i!=start && nums[start] == nums[i]) continue;
swap(nums[start], nums[i]);
permuteCore(nums, start + 1, res);
swap(nums[start], nums[i]);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int>> res;
if (!nums.size()) return vector<vector<int>>(res.begin(),res.end());
permuteCore(nums, 0,res);
return vector<vector<int>>(res.begin(), res.end());
}
};