Leetcode 第K個排列

2021-10-01 23:10:45 字數 1310 閱讀 4504

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