第k個排列 LintCode

2021-08-08 22:59:31 字數 912 閱讀 5365

給定 n 和 k,求123..n組成的排列中的第 k 個排列。

注意事項:

1 ≤ n ≤ 9

樣例:

對於 n = 3, 所有的排列如下:

123

132213

231312

321

如果 k = 4, 第4個排列為,231.

挑戰 :

o(n*k) in time complexity is easy, can you do it in o(n^2) or less?

思路:

不必將所有排列一一列出,由k值可以之間選出每一位的數字。

具體以n=4,k=10舉例:

首先構造乙個陣列v,0,1,2,3,4,v[i]即可表示第i個數。在處理本位置時,計算出下一位置的排列數,n=4,(n-1)!=6,(k-1)/(n-1)!+1=2,故應選擇v中第二個數,v[2]=2,此時結果為 「2」 ;令k=k%(n-1)!=4,同時去掉v中第2個數,此時v,0,1,3,4;(n-2)!=2,(k-1)/(n-2)!+1=2,取v[2]=3,此時結果為 「23」,刪除v[2],得v,0,1,4;k=k%(n-2)!=0,當k==0,說明是最後乙個排列,則取v[v.size()-1],結果」234」;最終加上v[1],

得到最終結果」2341」。具體步驟見**:

#ifndef c388_h

#define c388_h

#include

#include

#include

using

namespace

std;

class solution

res += nums[1];

return res;

}};#endif

第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 public string getpermutation int n,int k l...

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

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