参考资料:
注意的问题:
思路:
使用set的方法在最后去掉重复的。那有没更好的呢。
如下是比较优秀的解法:
优秀解法:在全排列之前进行判断是否和前面的数有相等的,如果有相等的话,那就跳过。
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > result;
int nLen=nums.size();
permuteCore(nums,result,0,nLen-1);
return result;
}
void permuteCore(vector<int>& nums,vector<vector<int> >& result,int begin,int end)
{
if(begin==end)
result.push_back(nums);
else
{
for(int i=begin;i<=end;i++)
{
if(IsPermute(nums,begin,i))//第i和数和前面是否有重复,如果重复就跳过
continue;
swap(nums[begin],nums[i]);
permuteCore(nums,result,begin+1,end);
swap(nums[begin],nums[i]);
}
}
}
bool IsPermute(vector<int> nums,int begin,int end)//如果第几个数和前面有相等的数的话,就跳过去
{
bool bFlag = false;
for(int i=begin;i<end;i++)
{
if(nums[end] == nums[i])
bFlag=true;
}
return bFlag;
}
};
普通解法:使用set
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int> > result;
int nLen=nums.size();
permuteCore(nums,result,0,nLen-1);
set<vector<int> > result1;
for(int i=0;i<result.size();i++)
{
result1.insert(result[i]);
}
result.clear();
for(auto iElement= result1.begin(); iElement!= result1.end();iElement++)
{
result.push_back(*iElement);
}
return result;
}
void permuteCore(vector<int>& nums,vector<vector<int> >& result,int begin,int end)
{
if(begin==end)
result.push_back(nums);
else
{
for(int i=begin;i<=end;i++)
{
swap(nums[begin],nums[i]);
permuteCore(nums,result,begin+1,end);
swap(nums[begin],nums[i]);
}
}
}
};