60. Permutation Sequence

来源:互联网 发布:ios开发淘宝购物车 编辑:程序博客网 时间:2024/05/01 18:44

此题为一道数学题。我们以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;    }};


0 0