此题为一道数学题。我们以n = 4,k = 17为例,数组nums = [1,2,3,...,n]。第17个排列的第一个数是什么呢:我们知道以某个数固定开头的排列个数 = (n-1)! = 3! = 6, 即以1和2开头的排列总共6*2 = 12个,12 < 17, 因此第17个排列的第一个数不可能是1或者2,6*3 > 17, 因此第17个排列的第一个数是3。即第17个排列的第一个数是原数组(原数组递增有序)的第m = upper(17/6) = 3(upper表示向上取整)个数。第一个数固定后,我们从nums数组中删除该数,那么就相当于在当前src的基础上求第k - (m-1)*(n-1)! = 17 - 2*6 = 5个排列,因此可以递归的求解该问题。代码如下:
class Solution {
public:
string getPermutation(int n, int k) {
int total = factorial(n);
string candidate = string("123456789").substr(0, n); //注意string的这种初始化方法
string res(n,' ');
for(int i = 0; i < n; i++) //依次计算排列的每个位。
{
total /= (n-i);
int index = (k-1) / total; //注意index的求法
res[i] = candidate[index];
candidate.erase(index, 1); //注意string erase方法的这种用法,表示从index开始删除1个元素
k -= index*total;
}
return res;
}
int factorial(int n)
{
int res = 1;
for(int i = 2; i <= n; i++)
res *= i;
return res;
}
};