LintCode 388: Kth Permutation

LintCode 388: Kth Permutation

题目描述

给定 nk,求123..n组成的排列中的第 k 个排列。

样例

对于 n = 3, 所有的排列如下:

123
132
213
231
312
321

如果 k = 4, 第4个排列为231.

Wed Mar 1 2017

思路

这道题很明显就不用什么算法呀,直接用除法算一下就好了。

为了取整方便,把题目中的 \(k\)\(1\) 开始计数,改成从 \(0\) 开始计数,即 \(k = k - 1\) 即可。

对于 \(n\) 个数,第 \(i\) 位数有 \(n - i + 1\) 个可选的数字\((1 \leq i \leq n)\),这个数字之后的排列情况有 \((n - i)!\) 种。

所以在待选数字集中第 \(\frac{k-1}{(n-1)!}\) 个数字就是应该放在第 \(i\) 位上。

代码

// 第k个排列
class Solution {
public:
    /**
      * @param n: n
      * @param k: the kth permutation
      * @return: return the k-th permutation
      */
    int fact(int k)
    {
        if (k <= 1) return 1;
        return k * fact(k - 1);
    }

    string getPermutation(int n, int k) 
    {
        string s;
        string* ans = new string();
        for (int i = 1; i <= n; ++i)
            s.push_back('0' + i);
        --k;
        for (int i = 1; i <= n; ++i)
        {
            int f = fact(n - i);
            int p = k / f;
            k -= p * f;
            ans->push_back(s[p]);
            s.erase(s.begin() + p);
        }
        return *ans;
    }
};
posted @ 2017-03-01 20:23  GenkunAbe  阅读(138)  评论(0编辑  收藏  举报