题意:给定1~n(n <= 9)个数,组成a[0]…a[n-1],求这个集合的第k小(字典序)的全排列;
传送门
输入:n = 3, k = 3
输出:“213”
输入:n = 4, k = 9
输出:“2314”
题解一:暴力,通过next_permutation
string getPermutation(int n, int k) {
string ret;
vector<int> v(n);
for (int i = 0; i < n; ++i)
v[i] = i+1;
do{
if (--k == 0) {
for (int &x : v) ret += char(x+'0');
break;
}
} while(next_permutation(v.begin(), v.end()));
return ret;
}
题解二:贪心,可将此题理解为x进制类题目,每次根据剩余k推出最左边的值
第一位,以1开头的数字共有(n-1)!个,同理2~9;
第二位,以1开头的数字共有(n-2)!个,同理……
同理……贪心选取每一位需要选取的数字。
string getPermutation(int n, int k) {
int mod = 1;
k -= 1;
set<int> vis;
for (int i = 1; i <= n; ++i) {
vis.insert(i);
if (i < n) mod *= i;
}
string ret;
for (int i = 0; i < n; ++i) {
int k_th = k / mod + 1;
for (auto &it : vis) {
if (--k_th == 0) {
ret += (char)(it+'0');
vis.erase(it);
break;
}
}
k %= mod;
if (i < n-1) mod /= n-1-i;
}
return ret;
}