LeetCode60 第k個排列(規律題)

2021-10-24 09:01:30 字數 1660 閱讀 1217

注:回溯法求全排列再輸出第k-1位超時,所以此題找規律

輸入: n = 3, k = 3

輸出: "213"

輸入: n = 4, k = 9

輸出: "2314"

31. 下乙個排列 

46. 全排列(不重複數字)回溯  

47. 全排列 ii(可重複數字)回溯、剪枝 

找規律法

①num = ['1', '2', '3', '4']

1打頭 3!

2打頭 3!

3打頭 3!

4打頭 3!

找第(15-1)個(因為陣列下標0開始,題目是1開始),可以判斷 6*2 < 14 <6*3,首位便是 3

②num = ['1', '2', '4']

1打頭 2!

2打頭 2!

4打頭 2!

找第(14-2*6)= 2個,可判斷首位是2,因為index = 2/2! = 1, pop出num.pop(1)為2

③num = ['1', '4']

1打頭 1!

4打頭 1!

找(2-1*2)= 0個,開判斷首位是1,因為index = 0/1! = 0, pop出num.pop(0)為1

class solution(object):

def getpermutation(self, n, k):

""":type n: int

:type k: int

:rtype: str

"""def recursion(n):

return 1 if n == 0 else n*recursion(n-1)

nums = [str(i+1) for i in range(n)]

# print(nums) # ['1', '2', '3', '4']

ans = ''

k = k-1 # 下標對齊,陣列下標從0,k=15-1

while nums:

temp = recursion(len(nums)-1) # 求3!= 6

index = int(k/temp) # 14/6 = 2,首位數字是3, 因為6*2 < 14 <6*3

# print(temp, index)

ans += nums.pop(index) # pop出index=2的數字3

k -= index*temp # k = 14 - 2*6

return ans

s = solution()

print(s.getpermutation(4, 15)) # 3214

solution/gua-he-xin-shou-peng-you-de-shi-pin-jiao-xue-by-sh/

LeetCode60 第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 示例 1 輸入 n 3,k 3輸出 213 示例 2 輸入 n 4,k 9輸出 23...

leetcode 60 第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...

LeetCode 60 第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...