内容简介:【LeetCode】60. Permutation Sequence
问题描述
https://leetcode.com/problems/permutation-sequence/#/description
he 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.
求n个数字组成的所有全排列字符串中的第k个字符串。
算法
因为只要求 1 个,所以可以按照全排列的规则,一个个数的求出每个位置的数字,而不需要将所有的全排列字符串列出来。
对于 n 个字符组成的字符串 {1,2,3,...,n} ,取第 k 个数时,首先可以求出第一个数,即 (k-1)/(n-1个数的排列个数) 。
比如 n=3,k=4 时,全排列组合为:
-
1+{2,3}的全排列 -
2+{1,3}的全排列 -
3+{1,2}的全排列
我们可以首先求出目标 排序 的第一个数字,即 (k-1)/(两个数的排列数) = (k-1)/2 = 3/2 = 1 ,下标从 0 开始,下标 1 表示的数就是 2 。
接下来,就是求出 {1,3} 全排列中排在第 k-2=2 个位置上的数,方法同 3 个字母时一样,求出结果后为 231 。
所以,可以一层一层的求出第 k 个顺序的字符串。
时间复杂度为 O(N) 。
一开始是以递归形式写的算法,相对容易理解,但速度慢,所以又写了循环版本的。
代码
循环版本
public String getPermutation(int n, int k) {
char[] nums = new char[]{'1','2','3','4','5','6','7','8','9'};
String tmp = "";
for(int i=0;i<n;i++) {
tmp += nums[i];
}
StringBuffer s = new StringBuffer(tmp);
String r = "";
while(k>0&&!s.toString().equals("")) {
// 计算 (n-1)的排列个数cnt
int cnt = 1, i = s.length()-1;
while(i > 1) {
cnt*=i;
i-=1;
}
int pos = (k-1)/cnt;
r += s.charAt(pos);
s = s.deleteCharAt(pos);
k -= pos * cnt;
}
return r;
}
递归版本
public String getPermutation1(int n, int k) {
char[] nums = new char[]{'1','2','3','4','5','6','7','8','9'};
String s = "";
for(int i=0;i<n;i++) {
s += nums[i];
}
return fun(new StringBuffer(s), k);
}
public String fun(StringBuffer s, int k) {
if(k<0 || s.toString().equals("")) return "";
int cnt = 1, tmp = s.length()-1;
while(tmp > 1) {
cnt*=tmp;
tmp-=1;
}
int pos = (k-1)/cnt;
return s.charAt(pos) + fun(s.deleteCharAt(pos), k - pos*cnt);
}
LeetCode解题代码仓库: https://github.com/zgljl2012/leetcode-java
转载请注明出处
:
http://www.zgljl2012.com/leetcode-60-permutation-sequence/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大思维:集体智慧如何改变我们的世界
杰夫·摩根 / 郭莉玲、尹玮琦、徐强 / 中信出版集团股份有限公司 / 2018-8-1 / CNY 65.00
智能时代,我们如何与机器互联,利用技术来让我们变得更聪明?为什么智能技术不会自动导致智能结果呢?线上线下群体如何协作?社会、政府或管理系统如何解决复杂的问题?本书从哲学、计算机科学和生物学等领域收集见解,揭示了如何引导组织和社会充分利用人脑和数字技术进行大规模思考,从而提高整个集体的智力水平,以解决我们时代的巨大挑战。是英国社会创新之父的洞见之作,解析企业、群体、社会如何明智决策、协作进化。一起来看看 《大思维:集体智慧如何改变我们的世界》 这本书的介绍吧!