LeetCode 第k個排列

2021-10-24 08:47:02 字數 1354 閱讀 7264

部落格說明

介紹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 = 3

輸出: "213"

示例 2:
輸入: n = 4, k = 9

輸出: "2314"

思路

深度優先搜尋(dfs)+ 剪枝

深度優先搜尋: 可以理解為暴力法遍歷矩陣中所有字串可能性。dfs 通過遞迴,先朝乙個方向搜到底,再回溯至上個節點,沿另乙個方向搜尋,以此類推。

剪枝: 在搜尋中,遇到 這條路不可能和目標字串匹配成功 的情況(例如:此矩陣元素和目標字元不同、此元素已被訪問),則應立即返回,稱之為 可行性剪枝 。

步驟如果 kk 大於這乙個分支將要產生的葉子結點數,直接跳過這個分支,這個操作叫「剪枝」

如果 kk 小於等於這乙個分支將要產生的葉子結點數,那說明所求的全排列一定在這乙個分支將要產生的葉子結點裡,需要遞迴求解

**

class solution 

private void dfs(boolean temp,int factorial,int index,stringbuilder path,int k,int n)

//全排列個數

int cnt = factorial[n-1-index];

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

//當時全排列個數

if(cnt < k)

temp[i] = true;

dfs(temp,factorial,index+1,path,k,n);

return;}}

//計算階乘陣列

private void calculatefactorial(int factorial, int n)

}}

感謝

leetcode

以及勤勞的自己,個人部落格,github

LeetCode 第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 第K個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。首先,我們先理解清楚全排列的過程。給定n 3,則123的全排列有 具體先固定住1,對23進...

60 第k個排列(leetcode)

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