[LeetCode Python3] 60. Permutation Sequence详解+全排列规律

60. Permutation Sequence

S1: 先给出全排列的代码,以便观察规律

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        track = []
        def trackback(track, n):
            if len(track) == n:
                print("".join(track))
                return
            for i in range(1, n+1):
                if str(i) in track:
                    continue
                track.append(str(i))
                trackback(track, n)
                track.pop()
        trackback(track, n)

S2: 通过全排列算法暴力输出第k个(超时)

# V2: Time Limit Exceeded
class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        track = []
        self.count = 0
        self.res = ""
        def trackback(track, n, k):
            if len(track) == n:
                self.count += 1
                if self.count == k:
                    self.res = "".join(track)
                    # print("".join(track))
                    return True
                return False
            for i in range(1, n+1):
                if str(i) in track:
                    continue
                track.append(str(i))
                if trackback(track, n, k):
                    return True
                track.pop()
            return False
        trackback(track, n, k)
        return self.res

S3: 根据全排列的规律求解
n个数的全排列分为n组,每组(n-1)!个。
按分组从左到右逐步确定元素

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        def factorial(n):
            if n < 2:
                return n
            else:
                return n * factorial(n-1)
        table = [str(i) for i in range(1, n+1)]
        rank = n-1
        nfac = factorial(rank)  # 每组的个数
        res = []
        while k and rank:
            index = (k-1) // nfac   # 求出在第几组
            k = k - nfac * index    # 求出在第几组中的第几个
            res.append(table[index])
            table.pop(index)
            nfac = nfac // rank     # 更新每组的个数
            rank -= 1
        res.extend(table)
        return "".join(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值