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 k th permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
題目描述
給定n,求從1到n的全排列中第k個全排列。
- 模擬全排列的生成過程,循環求第k個。
public String getPermutation(int n, int k) {
int[] nums = new int[n];
for ( int i=1 ; i<=n; i++ )
nums[i-1] = i ;
int index=0;
for ( int i=1; i<k; i++ ) {
for ( int j=n-1; j>0; j-- ) {
if ( nums[j]>nums[j-1] ) {
index = j ;
break;
}
}
for ( int j=n-1; j>=0; j-- ) {
if ( nums[j]>nums[index-1] ) {
int temp = nums[j];
nums[j] = nums[index-1];
nums[index-1] = temp;
break ;
}
}
for ( int j=index; j<=(index+n-1)/2; j++ ) {
int temp = nums[j];
nums[j] = nums[n-1-(j-index)];
nums[n-1-(j-index)] = temp;
}
}
StringBuilder b = new StringBuilder("");
for ( int i=0; i<n; i++ ) {
b.append(nums[i]);
}
return b.toString();
}
- 從1到n的全排列之中,第k個全排列的每一位可以計算出來。第一個全排列是123…n,對於第i位,其隨後的全排列數是(n-i)!個,當前位置的數字,就是k/(n-i)!,類比進制。
public String getPermutationM2(int n, int k) {
k--;
ArrayList<Integer> nums = new ArrayList<>();
for ( int i=1; i<=n; i++ ) nums.add(i);
int[] f = new int[n];
f[0] = 1;
for ( int i=1; i<n; i++ ) f[i] = i*f[i-1];
StringBuilder b = new StringBuilder("");
for ( int i=1; i<=n; i++ ) {
b.append( nums.get(k/f[n-i]) );
nums.remove(k/f[n-i]);
k %= f[n-i];
}
return b.toString();
}
歡迎交流指正~~