给出集合 [1,2,3,...,n]
,其所有元素共有 n!
种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3
时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n
和 k
,返回第 k
个排列。
示例 1:
输入:n = 3, k = 3 输出:"213"
示例 2:
输入:n = 4, k = 9 输出:"2314"
示例 3:
输入:n = 3, k = 1 输出:"123"
提示:
1 <= n <= 9
1 <= k <= n!
这道题我是按照题目要求模拟的,没有进行任何的优化,用dfs全搜出来,返回第k-1个即答案,大家可以参加一下,至少能过
先看看用时吧:
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int n,k;
vector<string> ans;
vector<int> arr;
bool b[N];
string s = "";
void dfs(int x){
if(x > k){
ans.push_back(s);
return ;
}
for(int i=0;i<n;i++){
if(b[i]) continue;
s += to_string(arr[i]);
b[i] = true;
dfs(x+1);
s.pop_back();
b[i] = false;
}
}
int main()
{
cin >> n >> k;
for(int i=1;i<=n;i++){
arr.push_back(i);
}
dfs(1);
int m = ans.size();
// for(int i=0;i<m;i++){
// cout << ans[i] << " ";
// }
cout << ans[k-1] << endl;
return 0;
}
加油呗