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)
这篇博客探讨了如何通过全排列算法找出给定整数n和k时的第k个排列。首先展示了全排列的代码实现,然后尝试通过暴力方法计算第k个排列,但由于效率低下导致超时。最后,博主提出了一种优化方法,根据全排列的规律,逐层确定每个位置的元素,从而高效地得出答案。这种方法基于阶乘和分组思想,减少了计算量。
637

被折叠的 条评论
为什么被折叠?



