一、问题描述
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,包含1到n这几个数字的全排列中,找到第k个数字(排好序的)。二、代码编写
找规律:很明显第一个数字就是所有数字的循环出现,直接用 ((k-1)/(n-1)!)% n即可。除以(n-1)的阶乘是因为,相同的数字会重复出现(n-1)的阶乘次,即后面所有n-1个数字的全排序数目。
第二个数字明显就是第二个数字的排列。虽然后面的数字不一定是顺序的,如不是[2,3]而是[1, 3],这时候的规律是剩下所有数字的下标。
如对于上述问题描述中的例子,k=4,后面两个数字是[1, 3],我们也可以根据k直接得到第二个数字。
代码:
'''
@ author: wttttt at 2016.12.16
@ problem description see: https://leetcode.com/problems/permutation-sequence/
@ solution explanation see: http://blog.csdn.net/u014265088/article/
@ github:https://github.com/wttttt-wang/leetcode
@ trick, simply looking for the law
'''
import math
class Solution(object):
def getPermutation(self, n, k):
"""
:type n: int
:type k: int
:rtype: str
"""
tt = [i for i in range(1, n+1)]
len_tt = len(tt)
rstr = ""
while len_tt > 1:
ind = ((k - 1) / math.factorial(len_tt - 1)) % len_tt
rstr += str(tt[ind])
# remove the number that already been added
if ind + 1 < len_tt:
tt = tt[:ind] + tt[(ind+1):]
else:
tt = tt[:ind]
len_tt -= 1
rstr += str(tt[0])
return rstr