LINTCODE——第k个排列

LINTCODE——第k个排列

问题:给定 n 和 k,求123..n组成的排列中的第 k 个排列。

思路:n个排列有n!种组合,根据k/(n-1)!来确定左边的数值,这说的说太抽象,举个例子吧;eg:n=5,k = 98,那么k/(n-1)!为num = 4,所以输出的string第一个就是num+1(不过当k%/(n-1)! == 0为特殊情况,额外处理一下就好了),还是看代码吧,跟着代码走一遍数值的变化就知道了;

class Solution {
public:
    /*
     * @param n: n
     * @param k: the k th permutation
     * @return: return the k-th permutation
     */
    string getPermutation(int n, int k) {
        // write your code here

        //两个数组,num存储n!的值,number存储1~n;
        vector<int> num,number;
        for(int i = 1 ,sum = 1; i <= n ; i++)
        {
            sum *= i;
            num.push_back(sum);
            number.push_back(i);
        }

        //边界处理
        if(n == 1)
            return "1";
        int N = num.size() - 1;
        if(k > num[N])
            return {};

        //主要程序
        string s = "";
        while(k)
        {
            N--;
            int knum = k/num[N];
            int kmod = k%num[N];
            //当kmod为0时特殊情况,就可以直接结束啦
            if(kmod == 0)
            {

                s += to_string(kthnumber(knum-1,number));
                for(int i = number.size()-1 ; i >=0; i--)
                    s += to_string(number[i]);
                return s;
            }

            s += to_string(kthnumber(knum,number));
            k = kmod;

        }


    }
    //根据传递过来的k/n!的值,计算值,并在number中删除该数
    int kthnumber(int knum ,vector<int> &number)
    {
        int temp = number[knum];
        number.erase(number.begin()+knum);
        return temp;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值