セットには 、合計が含ま Nを!ユニークな順列。[1,2,3,...,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"
問題の意味
1〜N!N辞書のk番目の行を識別するために配置された順列を、有しています。
考え
これは非常に数学の問題である、空想何のアルゴリズムは、あなたは運命の法則に行く必要はありません
コード
1 公共ストリングgetPermutation(int型のn、int型K){ 2 のchar []結果= 新しい CHAR [n]は、 3 一覧<整数>リスト= 新しい ArrayListを<> (); 4 INT []階乗= 新しい INT [N]。 5 6 階乗[0] = 1 。 7 のために(int型 i = 1; iがn <; iは++ ){ 8 階乗[I] =階乗[I-1] * I。 9 } 10 // 階乗:1、1、2 図11は、 // 完全な配列に対応する数Nを表し、 12は 13である ため(INT I = 1; I <= N; I ++の){ 14 List.add(I); 15 } 16 // 使用可能なデジタル1-2-3 、リストを容易に後でデジタル削除するため 17。 18である K--; // 高い数ピック 19 //の結果生成する最上位ビットから最後のビットまで開始 20である ため(int型 Iの<; I = 0をN-; Iは++ ){ 21である 結果、[I] = Character.forDigit(list.remove(K /階乗[N --- I 1。])、10 )、 22は K = K%の階乗[1 - N- I]; 23です } 24 戻る 新しい文字列(結果を)。 25 }