給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。
按大小順序列出所有排列情況,並一一標記,當 n = 3 時, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n 和 k,返回第 k 個排列。
首先,我們先理解清楚全排列的過程。給定n=3,則123的全排列有;
具體先固定住1,對23進行全排序,然後交換1和2的位置,對13進行全排序,再交換1和3的位置,對21進行全排序。
但這道題目不可採取先遞迴求全排序所有可能,再取要的答案。因為第5個排列為 312而不是321。所以應考慮從其他角度入手。
當n=1時,有1種排列,
當n=2時,有2種排列,
當n=3時,有6種排列,
其實n=3時,可以拆分成第一位數和 後兩位數,後兩位數的排列組合為n=2時的兩種,那第一位數可以是三個數種的任意乙個,所以總的排列數就是23=6
所以我們可以知道,當k<=2時,第一位數沒有變,那我們就可以確定第乙個數是最小數,那就對剩下的後兩位數分析,如果k=1那就確定第二位數是最小數,否則則是第二小數
當2**如下:
class solution {
public:
string getpermutation(int n, int k) {
string ans="";
string base="";
for(int i=1;i<=n;i++)
base+=char('0'+i);
if(k==1) return base;
while(k>1)
adjust(base,n,k,ans);
ans+=base;
return ans;
void adjust(string &s, int &n, int &k,string &ans)
int cur=jiecheng(n-1);
int i=0;
if(k<=cur )
n--;
ans+=s[i];
s.erase(i,1);
cur=jiecheng(n-1);
while(k>cur)
i++;
k-=cur;
ans+=s[i];
s.erase(i,1);
n--;
int jiecheng( int n)
int val=1;
for(int i=1;i<=n;i++)
val*=i;
return val;
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個排列
部落格說明 介紹60.第k個排列 題目 給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍...
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 輸出 ...