给出集合 [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"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package leetcode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class leet60 {
public String getPermutation(int n, int k) {
if(n<=0 || k>getFactorial(n) || k<=0) return "";
List<Integer> list = new ArrayList<>();
for(int i = 1;i<=n;i++) list.add(i);
int N = n;
int K = k;
StringBuffer result = new StringBuffer();
while(N > 1){
//阶乘
int factorial = getFactorial(N-1);
//商
int merchant = K/factorial;
//余数
int remainder = K%factorial;
if(remainder != 0) merchant++;
result.append(list.get(merchant-1));
list.remove(merchant-1);
Collections.sort(list);
N--;
K = remainder == 0 ? factorial: remainder;
}
result.append(list.get(0));
return result.toString();
}
public int getFactorial(int n){
int result = 1;
int N = n;
while( N>0){
result *= N;
N--;
}
return result;
}
public static void main(String[] args) {
leet60 l = new leet60();
System.out.println(l.getPermutation(4,100));
}
}