class Solution {
public:
unordered_set<int> _set;
vector<vector<int>> reslist;
void helper(int pos,vector<int>& nums ,vector<int> &res)
{
int lastval = -100;
for(int i = 0 ; i < nums.size();i++)
{
if(_set.count(i) == 0 && nums[i] != lastval ) // 已經選過的或者和上一次循環值相同的 就不用選了
{
res[pos] = nums[i];
lastval = nums[i];
_set.insert(i);
}
else
{
continue;
}
helper(pos+1,nums,res);
_set.erase(i);
}
if(pos == nums.size() - 1)
{
reslist.push_back(res);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<int> res(nums.size());
for(int i = 0 ; i < nums.size() ; i++)
{
res[i] == -1;
}
sort(nums.begin(),nums.end());
helper(0,nums,res);
return reslist;
}
};
方法2:效率更差
class Solution {
public:
vector<vector<int>>res;
vector<int>clist;
unordered_set<int> _set;
unordered_set<string>_set2;
vector<vector<int>> permuteUnique(vector<int>& nums) {
str = "";
helper(nums);
return res;
}
string str;
void helper(vector<int>& nums)
{
if(nums.size() == clist.size())
{
if(!_set2.count(str))
{
res.push_back(clist);
_set2.insert(str);
}
return;
}
for(int i = 0 ; i < nums.size();i++)
{
if(!_set.count(i))
{
clist.push_back(nums[i]);
str.push_back(to_string(nums[i])[0]) ;
_set.insert(i);
helper(nums);
_set.erase(i);
str.pop_back();
clist.erase( clist.begin() + clist.size() - 1 );
}
}
}
};