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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值