Leetcode练习(python):回溯算法类:第60题:第k个排列:给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132" "213" "231" "312" "321" 给定 n 和&#1

题目:
第k个排列:给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。  按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:  "123" "132" "213" "231" "312" "321" 给定 n 和 k,返回第 k 个排列。
思路:
回溯方法会超时,使用的是找规律的方法。
程序1:暴力中的暴力,超时了
class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        if n <= 0:
            return " "
        if n == 1 and k <= 1:
            return "1"
        result = []
        auxiliary = []
        inputData = [index for index in range(1, n + 1)]
        def backtrack(inputData, auxiliary, result):
            if len(auxiliary) == len(inputData):
                result.append(auxiliary[:])
                return
            for index1 in range(len(inputData)):
                if inputData[index1] in auxiliary:
                    continue
                auxiliary.append(inputData[index1])
                backtrack(inputData, auxiliary, result)
                auxiliary.pop()
        backtrack(inputData, auxiliary, result)
        auxiliary_auxiliary = ""
        result1 = result[k - 1]
        for index2 in range(len(result1)):
            auxiliary_auxiliary += str(result1[index2])
        return auxiliary_auxiliary
程序2:数学方法,找规律
class Solution(object):
    def getPermutation(self, n, k):
        if n <= 0:
            return " "
        if n == 1 and k <= 1:
            return "1"
        if k == 0:
            return ""
        result = ""
        inputData = [index for index in range(1, n+1)]
        while k > 1:
            tmp1 = self.nFactorial(n-1)
            tmp2 = (k-1) // tmp1
            result = result + str(inputData[tmp2])
            del inputData[tmp2]
            k -= tmp1 * tmp2
            n -= 1
        for item in inputData:
            result = result + str(item)
        return result
    def nFactorial(self, n):
        if n == 0:
            return 1
        if n == 1:
            return 1
        result = 1
        while n > 0:
            result *= n
            n -= 1
        return result
posted on 2020-05-09 16:22  桌子哥  阅读(533)  评论(0编辑  收藏  举报