前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Leetcode][python]Permutation Sequence/第k个排列

[Leetcode][python]Permutation Sequence/第k个排列

作者头像
蛮三刀酱
发布2019-03-26 16:05:48
5560
发布2019-03-26 16:05:48
举报

题目大意

找出由[1,2,3…n]中所有数字组成的序列中第k大的。

注意点: n为1-9中某一个数字

解题思路

来自:http://www.cnblogs.com/zuoyuan/p/3785530.html 我采用的方法是计算第k个Permutation。 假设n = 6,k = 400 先计算第一位, 第一位为6,那么它最少也是第5! * 5 + 1个排列,这是因为第一位为1/2/3/4/5时,都有5!个排列,因此第一位为6时,至少是第5! * 5 + 1个排列(这个排列为612345)。 5! * 5 + 1 = 601 > k,所以第一位不可能是6. 一个一个地枚举,直到第一位为4时才行,这时,4xxxxx至少为第5! * 3 + 1 = 361个排列。 然后计算第二位, 与计算第一位时的区别在于,46xxxx至少为第4! * 4 + 1 = 97个排列,这是因为比6小的只有5/3/2/1了。 最后可以计算出第二位为2。

代码

回溯(自己的思路)

这题标准回溯结构,所以我也尽量标准写法

代码语言:javascript
复制
class Solution(object):
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        curr = []
        self.result = ''
        for i in range(1, n+1):
            curr.append(i) 
        self.getPermutationHelper(n, k, curr)
        return self.result
    def getPermutationHelper(self, index, rest, curr):
        # print index, rest, '结果str:', curr
        if index == 0:
            return 
        for i in range(index-1, -1, -1):
            temp = math.factorial(index-1)
            # print temp, i, rest - (temp * i + 1)
            if rest - (temp * i + 1) >= 0:
                self.result += str(curr[i])
                curr.pop(i)
                # print(curr)
                self.getPermutationHelper(index-1, rest - (temp * i), curr)
                break

网上解法

其实思路是一样的,我的效率低下。

代码语言:javascript
复制
class Solution:

    def getPermutation(self, n, k):
        res = ''
        k -= 1
        fac = 1
        for i in range(1, n): fac *= i
        num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        for i in reversed(range(n)):
            curr = num[k/fac]
            res += str(curr)
            num.remove(curr)
            if i !=0:
                k %= fac
                fac /= i
        return res

总结

回溯是有基本结构的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目大意
  • 解题思路
  • 代码
    • 回溯(自己的思路)
      • 网上解法
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档