60順列シーケンスLeetCode] [k番目の配置(中)(JAVA)

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パーセントを打ちます

公開された81元の記事 ウォンの賞賛6 ビュー2278

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/104800050