60 第k個排列

2021-10-24 08:30:36 字數 1188 閱讀 6858

給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。

按大小順序列出所有排列情況,並一一標記,當 n = 3 時, 所有排列如下:

"123"

"132"

"213"

"231"

"312"

"321"

給定 n 和 k,返回第 k 個排列。

說明:給定 n 的範圍是 [1, 9]。

給定 k 的範圍是[1,  n!]。

1.回溯超時,剪枝也沒用,乙個剪枝的辦法是,當得到了答案的時候就停止搜尋,但每個測試用例能過,整體時間去超了

2.找規律

乙個乙個位置的確定,怎麼確定第乙個位置?後面的n-1個數可以組成(n-1)!個數,現在要找第k個數,k/(n-1)!就是第乙個數的在原陣列中的下標,然後依次執行即可

class solution:

def getpermutation(self, n: int, k: int) -> str:

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

self.l=0

self.res=""

def dfs(tmp,s,m):

if not tmp:

self.l+=1

if k==self.l:

self.res=s

return

for i in range(len(tmp)):

if m<=k:dfs(tmp[:i]+tmp[i+1:],s+tmp[i],self.l)

dfs(nums,"",0)

return self.res

class solution:

def getpermutation(self, n: int, k: int) -> str:

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

res=""

n-=1

while n>-1:

m=math.factorial(n)

l=math.ceil(k/m)

num=nums[l-1]

res+=num

nums.pop(l-1)

k%=m

n-=1

return res

60 第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 輸出 ...

60 第k個排列

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

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 ...