leetcode 60. 第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”
思路: 按照数学方法
将n个数依次放在数组中,
第k个排列的第i位的索引值:index = k / (n-i)!
更新k: k = k - index*(n-i)!
class Solution {
public String getPermutation(int n, int k) {
StringBuilder str = new StringBuilder();
List<Integer> num = new LinkedList<>();
int[] factorial = new int[n+1];
factorial[0] = 1;
for(int i=1; i<=n; i++){
factorial[i] = factorial[i-1]*i;
num.add(i);
}
k--;
for(int i=n; i>0; i--){
int index = k/factorial[i-1];
str.append(num.get(index));
num.remove(index);
k -= index*factorial[i-1];
}
return str.toString();
}
}