Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
public:
vector<vector<int>> vv;
vector<vector<int>> permuteUnique(vector<int>& nums) { // 题目开头
fun1(nums,0);
return vv;
}
bool Swap(vector<int>& nums,int i,int j) { //判断容器中有没有重复元素
int s=i;
while(nums[s]!=nums[j]&&s<j) {
s++;
}
if(s==j)
return true;
else
return false;
}
void fun1(vector<int>& nums,int j) {
int num1=nums.size();
if(j>num1-1)
vv.push_back(nums);
else {
for(int i=j;i<num1;i++) {
if(!Swap(nums,j,i)) //将重复元素的排列自动跳过,从j到i
continue;
swap(nums[i],nums[j]); //交换位置
fun1(nums,j+1);
swap(nums[i],nums[j]);
}
}
}
};
//1 2 3
/*[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]*/
#include <iostream>
#include <vector>
using namespace std;
classSolution {
public:
vector<vector<int>> vv;
vector<int> v;
vector<vector<int>> fun(vector<int>& num) {//全排序1的源代码
int n1=num.size();
fun2(num,0);
return vv;
}
void fun2(vector<int>& num,int j) {//全排序1.1
int n2=num.size();
if(j>n2-1)
vv.push_back(v);
else
{
for(int i=j;i<n2;i++)
{
v.push_back(num[i]);
swap(num[i],num[j]);
fun2(num,j+1);
swap(num[i],num[j]);
v.pop_back();
/*for(int k=0;k<3;k++)
cout<<v[k]<<"";
cout<<endl;*/
}
}
}
vector<vector<int>> fun3(vector<int>& num) {//全排序2
fun4(num,0);
return vv;
}
bool isSwap(vector<int>& num,int i,int j) {
int s=i;
while(num[s]!=num[j]&&s<j)
s++;
if(s==j)
return true;
else
return false;
}
void fun4(vector<int>& num,int j) {//全排序2.1
int n1=num.size();
if(j>n1-1)
vv.push_back(num);
else
{
for(int i=j;i<n1;i++) {
if(!isSwap(num,j, i))
continue;
swap(num[i],num[j]);
fun4(num,j+1);
swap(num[i],num[j]);
}
}
}
};
intmain() {
Solution q;
int t;
vector<int> num;
for(int i=0;i<3;i++)
{
cin>>t;
num.push_back(t);
}
q.fun(num);
//q.fun2(num,0);
//int a=q.fun(num).size();
//cout<<endl;
//输出
for(int i = 0; i < 6; i++)
{
for(int j = 0;j < 3; j++)
{
cout << q.vv[i][j] << " ";
}
cout << endl;
}
q.vv.clear();
cout<<endl;
q.fun3(num);
int a=q.vv.size();
for(int i = 0; i < a; i++)
{
for(int j = 0;j < 3; j++)
{
cout << q.vv[i][j] << " ";
}
cout << endl;
}
return 0;
}
结果显示: