leetcode 60 第k個排列

2021-10-01 16:37:31 字數 1377 閱讀 9880

### 題目

給出集合 [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"

### 思路

可以不用回溯法,直接通過要確定第幾個排列,從而確定每個位置的元素。

我們知道n個元素一共有n!種排列,那麼第n個數的每個不同的開頭都有(n-1)!種排列,那麼就可以可以對k做(n-1)!的除法得到第1個位置的數字應該是多少,然後再將k減去t*(n-1)!在開始迴圈,其中t就是k對(n-1)!做除法得到的商,具體通過乙個例子來講解:

假設 n=5,k=32,建立num矩陣[1,2,3,4,5].結果為res=「」;

通過計算得到(n-1)!=24,那麼k除以24得到的是乙個大於1小於2的數(這裡不能直接用兩個int相除,因為我們要判斷是否這個除數時大於某個整數m的,因為等於m的時候取m-1,大於m小於m+1的時候取值時m),那麼將t取值為1,取num[t]作為第一位的數,res=2,在num中刪除掉num[t],num變為[1,3,4,5],k=k-t*24=8.

(n-2)!=6,8/6大於1小於2,所以t取1,第二位的數為num[t],刪除num[t],num=[1,4,5],然後res=23,k=k-6=2;

(n-3)!=2,2/2等於1,所以t取0,第3位的數為num[t],刪除num[t],num=[4,5],然後res=231,k=k-2*0=2;

(n-4)!=1,2/1等於2,所以t取1,第4位的數為num[t],刪除num[t],num=[4],然後res=2315,k=k-1*1=1;

(n-5)!=1,1/1等於1,所以t取0,第5位的數為num[t],刪除num[t],num=,然後res=23154,k=k-1*1=0;

迴圈次數達到n的長度,迴圈結束,輸出結果23154。

### code

class solution 

string getpermutation(int n, int k) ;

if(n<=1)

return "1";

string res;

for(int i=1;i<=n;++i)

return 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個排列

給出集合 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 ...