【Leetcode] 60順列配列アラインメント配列

セットには   、合計が含ま  Nをユニークな順列。[1,2,3,...,n]

ために、順列のすべてをリストアップして標識することにより、我々はのために、次の順序取得  のn  = 3:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "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      }

 

おすすめ

転載: www.cnblogs.com/liuliu5151/p/10953063.html