美文网首页
60. Permutation Sequence

60. Permutation Sequence

作者: RobotBerry | 来源:发表于2017-05-02 15:12 被阅读0次

    问题

    The set [1,2,3,…,n] contains a total of n! unique permutations.

    By listing and labeling all of the permutations in order,
    We get the following sequence (ie, for n = 3):
    "123"
    "132"
    "213"
    "231"
    "312"
    "321"
    Given n and k, return the kth permutation sequence.

    Note: Given n will be between 1 and 9 inclusive.

    例子

    n = 3, k = 4
    "231"

    分析

    设n = 4,根据第一位数字的不同,可以将所有排列分成如下四种类型:
    1xxx
    2xxx
    3xxx
    4xxx
    每种类型的数量为3!。当然,我们也可以把每种类型再根据第二位数字的不同进行细分,例如3XXX可以分为31XX,32XX,34XX三类,每类的数量为2!。

    现假设要求第k=22个排列。由于习惯从0开始数,即第21个排列。21/3!=6...3,可以确定该序列的第一个数字为4;3/2!=1...1,可以确定第二个数字为2,1/1!=1...0,可以确定第三个数字为3;0/0!=0...0,可以确定第四个数字为1。因此第22个排列为4231。

    要点

    逐位求出第k个排列的数字。

    时间复杂度

    O(n)

    空间复杂度

    O(1)

    代码

    class Solution {
    public:
        string getPermutation(int n, int k) {
            string res(n, '0');
            int fact = 1;
            for (int i = 1; i <= n; ++i) {
                res[i - 1] += i;
                fact *= i;
            }
            
            k--;
            auto first = res.begin();
            for (; n > 0; --n, ++first) {
                fact /= n;
                auto cur = first + k / fact;
                // 将cur移到排列的首部
                rotate(first, cur, cur + 1);
                k %= fact;
            }
            
            return res;
        }
    };
    

    相关文章

      网友评论

          本文标题:60. Permutation Sequence

          本文链接:https://www.haomeiwen.com/subject/puictxtx.html