leetcode/60. Permutation Sequence

 

使用逆康托展开打阶乘表快速求解

 

逆康拖展开是从自然数到序列的映射


例如:

在(1,2,3,4,5)  给出61可以算出起排列组合为34152
具体过程如下:
用 61 / 4! = 2余13,说明  ,说明比首位小的数有2个,所以首位为3。
用 13 / 3! = 2余1,说明  ,说明在第二位之后小于第二位的数有2个,所以第二位为4。
用 1 / 2! = 0余1,说明  ,说明在第三位之后没有小于第三位的数,所以第三位为1。
用 1 / 1! = 1余0,说明  ,说明在第二位之后小于第四位的数有1个,所以第四位为5。

 

代码:

class Solution {
public:
    string getPermutation(int n, int k) {
        static const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
        string num = "123456789";
        string res = "";
        k--;
        for(int i = n;i>0;i--){
            int j = k/fac[i-1];
            k = k%fac[i-1];
            res+=num[j];
            num.erase(j,1);
        }
        return res;
    }
};

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值