60順列シーケンスLeetCode] [k番目の配置(中)(JAVA)
トピック住所:https://leetcode.com/problems/permutation-sequence/
件名の説明:
集合[1,2,3、...、n]は、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:
Input: n = 3, k = 3
Output: "213"
例2:
Input: n = 4, k = 9
Output: "2314"
効果の対象に
与えられた集合[1,2,3、...、n]は、すべての要素のn!順列の合計。
問題解決のアプローチ
1種 - k番目の始動装置1から第0 kから開始されます
実際には、限りのn番目の要素が計算されるように
1、K /(N - 1 )!n番目の要素を計算することができる
2、各元素の周期を算出します
class Solution {
public String getPermutation(int n, int k) {
if (n == 1 && k == 1) return "1";
List<Integer> list = new ArrayList<>();
int product = 1;
for (int i = 1; i <= n; i++) {
list.add(i);
if (i != n) product *= i;
}
k--;
StringBuilder res = new StringBuilder();
while (list.size() > 0) {
int cur = k / product;
res.append(list.remove(cur));
k = k % product;
product /= Math.max(1, list.size());
}
return res.toString();
}
}
実行時:2ミリ秒、のJavaに提出するすべてのユーザーの81.25パーセントを打つ
メモリ消費量:37.6メガバイトは、Javaで提出するすべてのユーザの5.78パーセントを打ちます