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