题目地址:
https://www.acwing.com/problem/content/description/1539/
给定一个长度为 n n n的可包含重复数字的序列,请你求出其所有不重复的全排列。
输入格式:
第一行包含整数
n
n
n。
第二行包含
n
n
n个整数。
输出格式:
输出所有的不同排列,每种排列占一行。
在确定每种排列的输出顺序时,第一个数较小的先输出,第一个数相同时,第二个数较小的先输出,以此类推。
数据范围:
1
≤
n
≤
9
1≤n≤9
1≤n≤9,
数组中包含的元素的取值范围
[
1
,
9
]
[1,9]
[1,9]
DFS即可。代码如下:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n;
int a[10];
bool vis[10];
vector<int> v;
void dfs() {
if (v.size() == n) {
for (int x : v) printf("%d ", x);
puts("");
return;
}
for (int i = 1; i <= n; i++) {
if (vis[i] || i > 1 && a[i] == a[i - 1] && !vis[i - 1]) continue;
vis[i] = true;
v.push_back(a[i]);
dfs();
vis[i] = false;
v.pop_back();
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
dfs();
}
时间复杂度 O ( n ! ) O(n!) O(n!),空间 O ( n ) O(n) O(n)。