1.递归+回溯+set
和上一题不同的是该数组中存在重复元素,则对最终的结果需要去重,这里使用set,但会导致效率不高
代码如下:
class Solution {
set<vector<int>> res;
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
//使用set去重,但会导致效率不高
vector<int> ans;
vector<bool> visited(nums.size(),false);
getCount(nums,ans,visited);
vector<vector<int>> r(res.begin(),res.end());
return r;
}
void getCount(vector<int> &nums,vector<int> &ans,vector<bool> &visited)
{
if(ans.size()==nums.size())
{
res.insert(ans);
return ;
}
for(int i=0;i<nums.size();i++)
{
if(visited[i]==false)
{
ans.push_back(nums[i]);
visited[i]=true;
getCount(nums,ans,visited);
ans.pop_back();
visited[i]=false;
}
}
}
};
2.递归+回溯+排序
计算之前首先排序,然后在遍历时,若当前元素未被访问,且当前元素与前一个元素相等且前一个元素已经被访问,则跳过当前元素
代码如下:
class Solution {
vector<vector<int>> res;
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<int> ans;
vector<bool> visited(nums.size(),false);
sort(nums.begin(),nums.end());
getCount(nums,ans,visited);
return res;
}
void getCount(vector<int> &nums,vector<int> &ans,vector<bool> &visited)
{
if(ans.size()==nums.size())
{
res.push_back(ans);
return ;
}
for(int i=0;i<nums.size();i++)
{
if(visited[i]==false)
{
if(i>0&&nums[i]==nums[i-1]&&visited[i-1]==true)
continue;
ans.push_back(nums[i]);
visited[i]=true;
getCount(nums,ans,visited);
ans.pop_back();
visited[i]=false;
}
}
}
};