leetcode60_Permutation Sequence

来源:互联网 发布:余弦相似度算法 java 编辑:程序博客网 时间:2024/06/06 03:24

一、问题描述

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):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "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 mathclass 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

0 0
原创粉丝点击