内容简介:【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/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
21天学通C语言
(美国)琼斯(Bradley L.Jones) (美国)埃特肯(Peter Aitken) / 信达工作室 / 人民邮电出版社 / 2012-8 / 69.00元
《21天学通C语言(第6版•修订版)》是初学者学习C语言的经典教程。本版按最新的标准(ISO∕IEC:9899-1999),以循序渐进的方式介绍了C语言编程方面知识,并提供了丰富的实例和大量的练习。通过学习实例,并将所学的知识用于完成练习,读者将逐步了解、熟悉并精通C语言。《21天学通C语言(第6版•修订版)》包括四周的课程。第一周的课程介绍了C语言程序的基本元素,包括变量、常量、语句、表达式、函......一起来看看 《21天学通C语言》 这本书的介绍吧!