题意
生成一个数组的全排列,去除重复的排列数组
题解
用递归实现。每个位置的数字都能和它后面的所有数字交换的,一共有n!种。
用set去重超时,需要在递归中剪枝。如果交换中两个数的中间有一个数和后面的交换数相同(说明前面的循环中已经生成过此种排列),则停止生成此种排列。
代码
class Solution {
public:
vector<vector<int> > result;
bool canSwap(vector<int> &nums, int begin, int end)
{
for(int i = begin; i < end; i++)
{
if(nums[i] == nums[end])
return false;
}
return true;
}
void gen_permutation(int pos, vector<int> &nums)
{
if(pos == nums.size())
{
result.push_back(nums);
}
else
{
for(int i = pos; i < nums.size(); i++)
{
if(canSwap(nums, pos, i)) if previsous loop hasn't this permutation that start with nums[pos]
{
swap(nums[i], nums[pos]);
gen_permutation(pos + 1, nums);
swap(nums[i], nums[pos]);
}
}
}
}
vector<vector<int> > permuteUnique(vector<int>& nums) {
gen_permutation(0, nums);
return result;
}
};