LeetCode 第k個排列(康托展開)

2021-09-10 19:49:49 字數 1208 閱讀 9419

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

思路分析:請先查閱 leetcode 全排列

本演算法採取回溯法進行搜尋,使用乙個變數記錄當前搜尋到的乙個排列,當搜到的位所需要的時候停止搜尋,返回排列結果。

class

solution

}else

useflag[index]

=false

;//重點。標記回未使用

tempres =

string

(tempres,

0, tempres.

size()

-1);

}}}return

false;}

string getpermutation

(int n,

int k)

};

具體實現**

class

solution

;//用於儲存i的階乘

vector

useflag

(n +1,

false);

//標記i是否使用過

string result ="";

k -=1;

//需要減去自身

康托展開和康托逆展開解決第K個排列問題

集合包含了 n!種不同的排列,將這n!種排列從小到大進行排序,某個排列為第k 個,求k時,使用康托展開,已知k求對應的排列時,使用康托逆展開。對於某個排列 a1,a2,a3,an 將其存入陣列s 求它在n!個排列中的位置k,用rli表示ai後面比ai小的數的個數,ri表示ai後面的數的個數,k 1 ...

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