1. 程式人生 > 實用技巧 >LeetCode 60 第k個排列

LeetCode 60 第k個排列

LeetCode60 第k個排列

題目描述

給出集合 [1,2,3,...,n],其所有元素共有 n! 種排列。

按大小順序列出所有排列情況,並一一標記,當 n = 3 時, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"

給定 nk,返回第 k 個排列。

樣例

輸入:n = 3, k = 3
輸出:"213"
輸入:n = 4, k = 9
輸出:"2314"
輸入:n = 3, k = 1
輸出:"123"

演算法分析

  • 列舉每個位置
  • 從高位到低位依次考慮每一位;
  • 對於每一位,從小到大依次列舉未使用過的數,確定當前位是幾

時間複雜度

Java程式碼

class Solution {
    public String getPermutation(int n, int k) {
        boolean[] st = new boolean[10];
        int[] f = new int[10]; //存的階乘
        f[0] = 1;
        for(int i = 1; i <= n; i++){
            f[i] = f[i - 1] * i;
        }

        String ans = "";
        for(int i = 0; i < n; i ++){
            for(int j = 1; i <= n; j++){
                if(!st[j]){
                    if(k <= f[n-i-1]){
                        ans = ans + "" + j;
                        st[j] = true;
                        break;
                    }
                    k -= f[n-i-1];
                }
            }
        }

        return ans;
    }
}