60 第k個排列

2021-10-09 12:39:43 字數 1134 閱讀 8311

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

這道題雖然是回溯,但是並不需要回去,因為到了一定時候直接結束了。

首先第一步就是計算出階乘,放到乙個private陣列中去。

。為什麼要設定階乘,因為要判斷k所在的位置,以以某個數字開頭的排列組合就有n-1階乘種可能。

如例子中的n=3,k=3的情況,那麼當遍歷第乙個1的時候,1就會有!(3-1)鐘可能性,在判斷的時候要拿cnt和k進行判斷。如果k大於cnt表示,要求數的位置並不再該枝葉上,這個枝葉要減去,直接continue

下面是**逐句分解

首先就是要形成階乘陣列,用來判斷第乙個數字所在的位置

然後開始寫dfs演算法,在寫演算法之前很多需要傳遞的引數就沒有設定好

dfs第一件事一定是判斷進入dfs條件是否符合預期。很明顯這裡的條件就是判斷儲存數字的長度是否和預期相等,如果小於說明沒到,剛好就直接return。

下一步,判斷當前所要加入的數字是否已經在路徑當中

然後給出當前idx最大的排列組合。這一步很重要,如果當前k

當cnt

這道題只需要剪枝和dfs,不需要回溯

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