給出集合 [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 = 3
輸出: "213"
示例 2:
輸入: n = 4, k = 9
輸出: "2314"
class solution:
def getpermutation(self, n: int, k: int) -> str:
k -= 1
res =
lis = [str(i) for i in range(1,n+1)]
factorial = 1
for i in range(1,n):
factorial *= i
factor = n-1
while factor >= 0:
index = k // factorial
lis.pop(index)
k %= factorial
if factor != 0:
factorial //= factor
factor -= 1
return ''.join(res)
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個排列
題目鏈結 題解 逆康托展開。考慮康托展開的過程。k v i n i 其中v i 表示在a i 1.n 中比a i 小的數字的個數 也即未出現的數字中它排名第幾 從0開始 那麼我們在逆康托展開的時候,就可以通過直接除 n i 得到每個數字的v i 的值。然後通過給已經出現的數字打tag。剩下的問題就轉...