1. 题目来源
链接:60. 排列序列
2. 题目解析
挺不错的一道题。两种方法一种直接调用 next_permutation()
函数,另一种类似计数 dp
。前者是
O
(
k
∗
n
!
)
O(k*n!)
O(k∗n!) 的时间复杂度,后者是
O
(
n
2
)
O(n^2)
O(n2)。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)。
- 空间复杂度: O ( n ) O(n) O(n)
代码:
// next_permutation()函数
class Solution {
public:
string getPermutation(int n, int k) {
string res;
for (int i = 1; i <= n; i ++ ) res += to_string(i);
for (int i = 0; i < k - 1; i ++ ) {
next_permutation(res.begin(), res.end());
}
return res;
}
};
// 计数 dp
class Solution {
public:
string getPermutation(int n, int k) {
string res;
vector<bool> st(n);
for (int i = 0; i < n; i ++ ) {
int fact = 1;
for (int j = 1; j <= n - i - 1; j ++ ) fact *= j;
for (int j = 1; j <= n; j ++ ) {
if (!st[j]) {
if (fact < k) {
k -= fact;
continue;
}
else {
st[j] = true;
res += to_string(j);
break;
}
}
}
}
return res;
}
};