給定 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 ...