您的位置:首页 > 产品设计 > UI/UE

LeetCode-------60. Permutation Sequence(n的全排列中第K列)

2016-11-08 11:31 423 查看
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.

Subscribe to see which companies asked this question
思路一:求出全排列,回溯法;然后找出第k个(算法复杂度过高-----N!)
思路二:数学解析
已知n的值,学过排列组合知道共有n!种排列。

 
第一位每个数字开头的序列都有(n-1)!个序列,因此n个数字所以共有n!个序列。
 
以此类推,第二位每一个数开头都有(n-2)!个序列。
 
因为数字不能重复,我用sign记录数字是否使用过,data存阶层的值。
 
每次循环找到没使用过的数中第k/data[i]个数就是当前位的数字。

设变量K1 = K
a1 = K1 / (n-1)!// 第一位的选择下标

同理,a2的值可以推导为

K2 = K1 % (n-1)!
a2 = K2 / (n-2)!

。。。。。

K(n-1) = K(n-2) /2!
a(n-1) = K(n-1) / 1!

an = K(n-1)
public class Solution {

public String getPermutation(int n, int k) {
StringBuilder sb = new StringBuilder();
boolean[] used = new boolean
;

k = k - 1;
int factor = 1;
for (int i = 1; i < n; i++) {
factor *= i;
}

for (int i = 0; i < n; i++) {
int index = k / factor;
k = k % factor;
for (int j = 0; j < n; j++) {
if (used[j] == false) {
if (index == 0) {
used[j] = true;
sb.append((char) ('0' + j + 1));
break;
} else {
index--;
}
}
}
if (i < n - 1) {
factor = factor / (n - 1 - i);
}
}

return sb.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: