Permutation Sequence
Posted Sheryl Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
这题蛮有意思,按照之前permutation的思路挨个枚举,直到枚举到当前位置,这种做法很不幸超时了,仔细想想也是,这题并不需要把之前每一步permutation的结果都获取到,来到当前结果,所以一个更好的办法是基于组合数学的。即根据k的大小,直接估计所要求的数。具体思路可以参考 Yanbing Shi的博客
class Solution(object): def getPermutation(self, n, k): """ :type n: int :type k: int :rtype: str """ nums = range(1,n+1) res = [] factorial = [1] * n for i in xrange(1, n): factorial[i] = factorial[i-1]*i i = n-1 k -= 1 while i >= 0: index = k / factorial[i] res.append(str(nums.pop(index))) k = k % factorial[i] i -= 1 return ‘‘.join(res)
值得注意的是k一开始要减1,因为pop数的时候最终需要pop第0位。比如对1,1的例子,1/1=1,但是此时只有一位,是无法pop出结果的,所以将k先减1是比较好的做法。
这种做法时间复杂度位O(n^2),按index pop是O(n)的时间复杂度,而空间复杂度也为O(n).
以上是关于Permutation Sequence的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode31 Next Permutation and LeetCode60 Permutation Sequence
LeetCode(60):Permutation Sequence