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

60. Permutation Sequence

2016-04-24 18:59 351 查看
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.

思路:这题的第一想法肯定是回溯一遍,列出所有结果,然后输出第k个,但是显然是tlc的,这里我们可以讲一下思路,对于n=5的,最高位没差一下,中间的差值就有4!个,次高位就是3! 个。根据此规律我们就没有必要回溯列出所有的了

代码如下(已通过leetcode)

public class Solution {

public String getPermutation(int n, int k) {

StringBuilder res = new StringBuilder();

boolean[] flag = new boolean
;

int temp = 1;

for (int i = 1; i <= n; i++)

temp = temp * i;

int[] data = new int[n + 1];

data
= temp;

data[0] = 1;

for (int i = n - 1; i >= 1; i--)

data[i] = data[i + 1] / (i + 1);

int numsLeft = n;

for (int i = 0; i < n; i++) {

if (numsLeft > 1) {

int mThUnused = (k - 1) / data[numsLeft - 1];

int counter = -1;

int head = 0;

for (; head < n && counter < mThUnused; head++) {

if (!flag[head])

counter++;

}

flag[head - 1] = true;

res.append(head);

k = k - mThUnused * data[numsLeft - 1];

numsLeft--;

} else

for (int j = 0; j < n; j++)

if (!flag[j]) {

res.append(j + 1);

break;

}

}

return res.toString();

}

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