LeetCode---Permutation Sequence

题目大意:给出两个数n和k,求出有字符序列1...n组成的序列的第K个排列。1=<n<=9

算法思想:

此题用常规的做法容易超时如字典序法或递归方法。因此根据全排列的性质,3个元素组成的序列有6中排列,4个元素组成的序列有24中排列。。。。当要得到第K个元素时先找到他的开头元素,p=(k-1)/(n-1)!,则由其组成该排列的首元素,后面的操作一次类推。

思想细化为:

1.计算pTable[n]用于存储当前规模排列个数

2.建立一个集合numchar{'1','2',...'n'}

3.计算当前首字符

4.迭代K值  和n值

代码如下:

class Solution {
public:
    string getPermutation(int n, int k) {
        int pTable[10]={1};
        for(int i=1;i<=9;++i){
            pTable[i]=pTable[i-1]*i;
        }
        vector<char> numChar;
        for(int i=1;i<=n;++i){
            numChar.push_back(i+'0');
        }
        string res;
        while(n>0){
            int temp=(k-1)/pTable[n-1];
            res+=numChar[temp];
            numChar.erase(numChar.begin()+temp);
            k=k-temp*pTable[n-1];
            --n;
        }
        return res;
    }
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值