有重复元素的全排列
1.回溯过程中去重
- 前一位被使用,并且当前位与前一位元素相同,不进入排列
void generateP(int index)
{
if(index > n)
{
ret.push_back(tmp);
return;
}
for(int i = 1; i <= n; ++i)
{
if(i > 1 && has_in_p[i - 1] && nums[i] == nums[i - 1])
continue;
if(has_in_p[i] == false)
{
tmp.push_back(nums[i]);
has_in_p[i] = true;
generateP(index + 1);
has_in_p[i] = false;
tmp.pop_back();
}
}
}
2.排列存入set去重
set<vector<int>> ret;
void generateP(int index)
{
if(index > n)
{
ret.insert(tmp);
return;
}
for(int i = 1; i <= n; ++i)
{
if(has_in_p[i] == false)
{
tmp.push_back(nums[i]);
has_in_p[i] = true;
generateP(index + 1);
has_in_p[i] = false;
tmp.pop_back();
}
}
}
3.库函数 next_permutation 生成全排列
- 生成给定序列的下一个较大排序,直到序列按降序排列为止
- 需用 sort 保证序列为升序
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; ++i)
cin >> nums[i];
sort(nums.begin(), nums.end());
do
{
cout << nums[0];
for(int i = 1; i < n; ++i)
cout << " " << nums[i];
cout << endl;
}while(next_permutation(nums.begin(), nums.end()));
不含重复元素的全排列
#include <iostream>
#include <vector>
using namespace std;
const int N = 10;
vector<bool> has_in_p(N, false);
vector<int> P(N);
vector<int> nums(N);
int n;
void generateP(int index)
{
if(index > n)
{
cout << P[1];
for(int i = 2; i <= n; ++i)
cout << " " << P[i];
cout << endl;
return;
}
for(int i = 1; i <= n; ++i)
{
if(has_in_p[i] == false)
{
P[index] = nums[i];
has_in_p[i] = true;
generateP(index + 1);
has_in_p[i] = false;
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> nums[i];
generateP(1);
return 0;
}