这道题和全排列那道很像,只是这道题有重复元素而已。有重复元素的话,我们就要先排序,把重复的给集中到一起。之后我们做出本题的树形结构,辅助解题。
我们知道,我们为了去重还是需要used数组,去重的逻辑就是
if(i>0&&num[i]==num[i-1]&&used[i-1]==false)
//我们需要知道,在这里的话used[i-1]==false是树层去重,就是左右方向
//而used[i-1]==true是树枝去重,就是上下方向
在本题当中树枝去重,树层去重都可以,我们选取树层去重,因为效率高。
为什么是等于false时是树层去重,我们可以认为回溯操作时,我们有操作used[i]=false,回溯之后,回溯到了上一层,所以我们认为false的时候是树层去重。
具体代码如下
vector<int>path;
vector<vector<int>>res;
void backtrack(vector<int>&num,vector<bool>&used)
{
if(path.size()==num.size())
{
res.push_back(path);
return ;
}
for(int i=0;i<num.size();i++)
{
if(i>0&&num[i]==num[[i-1]&&used[i-1]==false)continue;
path.push_back(num[i]);
used[i]=true;
backtrack(num,used);
used[i]=false;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool>used(nums.size(),false);
sort(nums.begin(),nums.end());
backtrack(nums,used);
return res;
}