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.
首先可以想到一个简单直白的方法,即调用 k-1 次 next_permutation(),从而得到第k个排列。这个方法把前k个排列全部求出来了,比较浪费,时间复杂度是 O(kn),所以会超时。有没有办法直接求第k个排列呢?有!
利用康托编码的思路,假设有n个不重复的元素,第k个排列是$$a_1, a_2, a_3, ..., a_n$$,那么$$a_1$$是哪一个位置呢?
我们把$$a_1$$去掉,那么剩下的排列为
n-1个元素,n-1个元素共有(n-1)!个排列,于是就可以知道
同理,$$a_2, a_3, ..., a_n$$ 的值推导如下:
{% codesnippet "./code/permutation-sequence."+book.suffix, language=book.suffix %}{% endcodesnippet %}