Permutation Sequence
The set [1,2,3,…,n] contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
Analysis
举例:n=3, k=5
- 得到factorial[] = {1,1,2} (算n!,方便后面使用)
- 得到numbers = {1,2,3} (用来加到string里面去的元素)
- k--: k=4
- while循环i从1到3
- i=1
- (3-1)!=2, 加上第一个数以后,有两种变换方法
- 4/2 = 2,加入numbers[2]=3(注意这里k要减一)
- 从numbers里除去numbers[2],numbers变为{1,2}
- 4减去2*2 = 0,下一个问题中的第0顺位
- i=2
- (3-2)!=1
- 0/1=0, 加入numbers[0]=1
- 移除number[0], numbers = {2}
- 0减去1*0 = 0
- i=3
- (3-3)!=1
- 0/1=0, 加入numbers[0]=2
- 移除numbers[0],numbers变为{}
- 0减去1*0=0
- i=1
Code
public class Solution {
public String getPermutation(int n, int k) {
List<Integer> numbers = new ArrayList<Integer>();
int[] factorial = new int[n+1];
StringBuilder sb = new StringBuilder();
//create an array of factorial lookup
int sum = 1;
factorial[0]=1;
for(int i=1; i<=n; i++){
sum *= i;
factorial[i] = sum;
}
//factorial[] = {1,1,2,6}
for (int i=1; i<=n; i++){
numbers.add(i);
}
//numbers = {1,2,3}
k--;
for(int i=1; i<=n; i++){
int index = k/factorial[n-i];
sb.append(String.valueOf(numbers.get(index)));
numbers.remove(index);
k -= factorial[n-i]*index;
}
return sb.toString();
}
}
Note
- stringBuilder.append(string)
- ArrayList.get(index)
- String.valueOf(object)
- ArrayList.remove(index)
- stringBuilder.toString()