第k個排列
題目敘述:
給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。
按大小順序列出所有排列情況,并一一標記,當 n = 3 時, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n 和 k,返回第 k 個排列。
說明:
- 給定 n 的范圍是 [1, 9]。
- 給定 k 的范圍是[1, n!]。
示例:
示例1:
輸入: n = 3, k = 3
輸出: "213"
示例2:
輸入: n = 4, k = 9
輸出: "2314"
解題思路:
這一題的解題思路主要這樣的,當我們n=1的時候會有1種情況,n=2會有2種情況,n=3會有6種情況,n=n會有(n!)種情況。當我們選擇第k個序列的時候相當于我們的首位可以是第k/(n-1)!個數,依次第二位將是k%(n-1)!/(n-2)!個數······等等,因此我們將1~n用一個List集合存儲起來,取出一個數后將其在List移出。直到List移空。時間復雜度為O(n)。
代碼實現:
class Solution {
public String getPermutation(int n, int k) {
int[] nums = new int[n];
List<Integer> help = new ArrayList();
StringBuffer res=new StringBuffer();
int num = 1;
for (int i = 1; i < n+1; i++) {
num *= i;
nums[i - 1] = num;
help.add(i);
}
k--;
for (int i = n - 2; i > -1; i--) {
res.append(help.get(k/nums[i]));
help.remove(help.get(k/nums[i]));
k%=nums[i];
}
res.append(help.get(0));
return res.toString();
}
}