思路:利用TreeSet来保存结果,利用其不会有重复项的特点,然后我们再递归函数中的swap的地方,判断如果i和r不相同,但是 nums[i] 和 nums[r] 相同的情况下跳过,继续下一个循环
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int> > ans;
permuteUniqueDFS(nums,0,ans);
return vector<vector<int> >(ans.begin(),ans.end());
}
void permuteUniqueDFS(vector<int>& nums,int r,set<vector<int> > &ans)
{
if(r>=nums.size()) ans.insert(nums);
for(int i=r;i<nums.size();++i)
{
if(i!=r&&nums[r]==nums[i]) continue;
swap(nums[r],nums[i]);
permuteUniqueDFS(nums,r+1,ans);
swap(nums[r],nums[i]);
}
}
};