leetcode 60

這道題其實可以通過給的n值知道一共有n!種組合,通過給的k值可以知道開頭第一位數字是多少,舉例來說,比如n的值是4,可以知道一共有24中組合方式(1234,1243,...,4321),如果k是14的話(寫代碼的時候k要減一操作),可以知道如果n是3的時候有6種組合,14/6=2可以知道,第一位的數字是3,這樣還剩下124在后三位,然后用14-26=2,可以知道新的k的值;
此時n就變成了三位數的排列組合,如果要判斷第二位數,此時用2/2=1,也就是說,第二位是1;
然后再次更新k=2-1
2 = 0,也就是說后面是按從小到大的順序,2,4,得到3124是第14個數,代碼如下:

public static String getPermutation(int n, int k) {
        if (k <= 0) return null;
        if (n <= 0) return null;
        int num = 1;
        List<Integer> numbers = new ArrayList<>();
        int[] fac = new int[n+1];
        fac[0] = 1;
        String str = "";
        //計算不同的n,組合的數量
        for (int i = 1; i <= n; i++) {
            num *= i;
            fac[i] = num;//{1,1,2,6,24,...}
//            System.out.println(fac[i]);
        }
        for (int i = 1; i <= n; i++) {
            numbers.add(i);
        }
        k--;
        for (int i = 1; i <= n; i++) {
            int first = k/fac[n-i];//計算是幾開頭的數
            str = str + Integer.toString(numbers.get(first));
//            System.out.println(str);
            numbers.remove(first);
            k = k - first * fac[n-i];
        }
        return str;
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容