47. 全排列 II
题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[ [1,1,2], [1,2,1], [2,1,1] ]
思路
相当于找出所有不同的num.size()元组来,我们只需要保证设计程序时,对于这个元组每个位置的可能情况枚举时,每次做到不重复,才能之后再继续递归下去。
代码
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num)
{
vector<vector<int>> ret;
int size = num.size();
if(size == 0)
return ret;
permuteUniqueCore(num,0,ret);
return ret;
}
//判断cur位置处的元素如果放置在begin处,是否是首次出现,如果以前出现过,则
//返回false
bool check(vector<int>&num,int begin,int cur)
{
for(int pre = begin;pre < cur;pre++)
{
if(num[cur] == num[pre])
return false;
}
return true;
}
void permuteUniqueCore(vector<int> &num,int index,vector<vector<int>> &ret)
{
if(index == num.size())
{
ret.push_back(num);
return;
}
else
{
for(int i = index;i < num.size();i++)
{
if(i == index)
permuteUniqueCore(num,index+1,ret);
else if(check(num,index,i))
{
swap(num[index],num[i]);
permuteUniqueCore(num,index+1,ret);
swap(num[index],num[i]);
}
}
}
}
};