60-第k个排列

60、第k个排列

https://leetcode-cn.com/problems/permutation-sequence/

题目:

aMZG9K.png

题解:

思路就是找规律,发现第n位的数字与n-1的全排列数有关系。下面的题解与我思路一致,但我没能将过程叙述出来,向大佬低头。

假设n=5,k=35,
n为5的全排列就是首位为1-5的如下排列的所有
1_,,,2,,,3,,,4,,,5,,,每个各有24个排列,组成12345的全排列
由于k=35<48,也就是说第35个肯定在首位为2的全排列里边,所以第一个取2。
接下来就是考虑剩下1345这四个数的全排列里边取第k=35-24=11个,
1,,3,,4,,5,,每个各有6个排列,组成1345的全排列,
由于k=11<12,也就是说第11个肯定在首位为3的全排列里边,所以第二个数取3
接下来就是考虑剩下145这三个数的全排列里边取第k=11-6=5个,
1,4,5,_每个各有2个排列,组成145的全排列
由于k=5<6,也就是说第5个肯定在首位为5的全排列里边,所以第三个数取5
接下来就是考虑剩下14这两个数的排列里边取第k=5-4=1个
1_4_每个各有1个排列,组成14的排列,
由于k=1,所以第四个数取1
最后加上剩下的最后一个4,结果就是23514
结束。

作者:xiao-xu-10
链接:https://leetcode-cn.com/problems/permutation-sequence/solution/zhe-ti-ru-guo-di-gui-jiu-zuo-fu-za-liao-qi-shi-shi/

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def getPermutation(self, n: int, k: int) -> str:
num = []
res = ""
for i in range(1, n+1):
num.append(i)
for i in range(n):
count = math.factorial(n - (i + 1))
index = (k - 1) // count
res += str(num[index])
num.remove(num[index])
k = k - count * index
return res

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器