给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
思路:同一层内去重 (用unorder_set)+同一树枝上使用过的不再用(used数组)
或者用used[i-1]的值与nums[i]==nums[i-1]联合判断;如果used[i-1]==true则表示同一树枝用过,used[i-1]==false则表示同一层用过。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
vector<bool> used;
public:
void backtracking(vector<int>& nums,vector<bool>& used){
//终止条件
if(path.size()==nums.size())
{
result.push_back(path);
return;
}
//本层操作
unordered_set<int> hash;
for(int i=0;i<nums.size();i++)
{
if(hash.find(nums[i])!=hash.end()||used[i]==true) continue;
path.push_back(nums[i]);
hash.insert(nums[i]);
used[i]=true;
backtracking(nums,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
result.clear();
path.clear();
used.assign(nums.size(),false);
sort(nums.begin(),nums.end());
backtracking(nums,used);
return result;
}
};