详细见:leetcode.com/problems/permutation-sequence
Java Solution: github
package leetcode;
import java.util.Vector;
public class P060_PermutationSequence {
public static void main(String[] args) {
Solution s = new Solution();
for (int i = 1; i != 25; i ++)
System.out.println(i + "..."+s.getPermutation(4, i));
// tools.Utils.printArray(s.cs, 10);
// tools.Utils.printArray(s.jiecheng, 10);
}
/*
* 2 ms
* 73.96%
*/
static class Solution {
int[] jiecheng = null;
int[] cs = null;
public String getPermutation(int n, int k) {
if (n < 1)
return "";
k --;
generateJiecheng(n);
cs = new int[n];
for (int i = 0; i != n; i ++) {
cs[i] = k / jiecheng[n - 1- i];
k = k % jiecheng[n - 1- i];
}
Vector<Integer> v = new Vector<Integer>(n);
for (int i = 0; i != n; i ++)
v.add(i);
char[] temp = new char[n];;
for (int i = 0; i != n; i ++) {
temp[i] = (char)('1' + v.get(cs[i]));
v.remove(cs[i]);
}
return new String(temp);
}
void generateJiecheng(int n) {
jiecheng = new int[n];
jiecheng[0] = 1;
for (int i = 1; i != n; i ++)
jiecheng[i] = i * jiecheng[i - 1];
}
}
/*
* 让代码更加简洁
* 计算逻辑没有任何改变
* 少用了一个长度为N的数组
* 但是更慢了。。。。
* 3 ms
* 26.31%
*/
static class Solution2 {
int[] jiecheng = null;
char[] cs = null;
public String getPermutation(int n, int k) {
if (n < 1)
return "";
k --;
generateJiecheng(n);
cs = new char[n];
Vector<Integer> v = new Vector<Integer>(n);
for (int i = 0; i != n; i ++)
v.add(i);
for (int i = 0; i != n; i ++) {
int v_index = k / jiecheng[n - 1- i];
cs[i] = (char)('1' + v.get(v_index));
k = k % jiecheng[n - 1- i];
v.remove(v_index);
}
return new String(cs);
}
void generateJiecheng(int n) {
jiecheng = new int[n];
jiecheng[0] = 1;
for (int i = 1; i != n; i ++)
jiecheng[i] = i * jiecheng[i - 1];
}
}
}
C Solution: github
/*
url: leetcode.com/problems/permutation-sequence/
AC 3ms 54.55%
*/
#include <stdio.h>
#include <stdlib.h>
char* getPermutation(int n, int k) {
char* ans = (char*) malloc(sizeof(char) * (n+1));
int* h = (int*) malloc(sizeof(int) * n);
int* m = (int*) malloc(sizeof(int) * n);
int ai = 0, ni = 0;
int i = 0, v = 1, cnt = 0, mi = 0;
k --;
for (i = 0; i < n; i ++)
m[i] = 0;
for (i = n-1; i > -1; i --) {
h[i] = v;
v *= (n - i);
}
for (ni = 0; ni < n-1; ni ++) {
cnt = k / h[ni];
mi = 0;
while (cnt > 0) {
while (m[mi] == 1) mi ++;
mi ++;
cnt --;
}
while (m[mi] == 1) mi ++;
ans[ni] = (char) ('1' + mi);
m[mi] = 1;
k = k % h[ni];
}
for (i = 0; i < n; i ++)
if (m[i] == 0) {
ans[n-1] = (char)('1' + i);
}
ans[n] = '\0';
free(h);
free(m);
return ans;
}
int main() {
int n = 6;
int k = 1;char* ans = NULL;
for (k = 1; k <= 6*5*4*3*2; k ++) {
char* ans = getPermutation(n, k);
printf("k is %d answer is %s\r\n", k, ans);
free(ans);
}
return 0;
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/permutation-sequence
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月12日
@details: Solution: 75ms 10.83%
'''
class Solution(object):
def getPermutation(self, n, k):
"""
:type n: int
:type k: int
:rtype: str
"""
q, m, ti, a, k = [1]*n, [False]*n, 0, [""]*n, k-1
for i in range(n-2, -1, -1):
q[i] = q[i+1] * (n-1-i)
for i in range(n-1):
t, ti = k // q[i], 0
while t > 0:
ti += 1
if m[ti-1]:continue
t -= 1
k -= q[i]
while m[ti]: ti += 1
m[ti] = True
a[i] = str(ti+1)
ti = 0
while m[ti]: ti += 1
a[n-1] = str(ti+1)
return "".join(a)
if __name__ == "__main__":
print(Solution().getPermutation(3, 6))
本文提供了一种解决LeetCode上排列序列问题的有效方法。通过使用Java、C和Python三种语言实现,介绍了如何找到第k个排列的方法。算法核心在于计算阶乘和确定每个位置上的数字。

495

被折叠的 条评论
为什么被折叠?



