60. Permutation Sequence

问题

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)