首页 > 代码库 > 每日算法之四十二:Permutation Sequence (顺序排列第k个序列)
每日算法之四十二:Permutation Sequence (顺序排列第k个序列)
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.
第一位每个数字开头的序列都有(n-1)!个序列,因此n个数字所以共有n!个序列。
以此类推,第二位每一个数开头都有(n-2)!个序列。
因为数字不能重复,我用sign记录数字是否使用过,data存阶层的值。
每次循环找到没使用过的数中第k/data[i]个数就是当前位的数字。(这就是中间带有break的循环的原因)
对于这种不好确定次序的情况,应该举例说明,这样就能很清楚的看明白是否应该多加一个或者少减一个。
class Solution { public: string getPermutation(int n, int k) { int data[10]; vector<bool> visited(10,0); data[0]=1; for(int i=1;i<=n;i++) { data[i]=data[i-1]*i; } string str(n,'0'); --k; //从0位开始算起,例如,从1开始算的第5个,也就是从0开始算的第四个 for(int i=n-1;i>=0;i--) { int temp_k=k/data[i]; int j=1; for(;j<10;j++) { if(visited[j]==0) temp_k--; if(temp_k<0) break; } visited[j]=1; str[n-i-1]='0'+j; k=k%data[i]; } return str; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。