【Leetcode】Permutation Sequence
2013-12-17 21:20
399 查看
The set
unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
题意:在给定数字n的全排列中找到第k个字符串,并返回。
关键点:1)设num=(k-1)/factorial,factorial是1至n-1的乘积。可以知道第一个数就是从1到n中第num+1大的数,然后将reminder=(k-1)%factorial作为下一轮的k,这时求num不再需要让k-1。
2)按照上述方式不断的求下一轮的数字,将其添加到返回字符串s的结尾处,并将已经添加的数字置为0,这个时候寻找第num+1大的数时要记得忽略掉之前已经添加的数。
3)如此循环往复,直到n=0.
class Solution {
public:
string getPermutation(int n, int k) {
if(n==1)
return "1";
string s="";
int *a=new int
;
for(int i=0;i<n;i++)
{
a[i]=i+1;
}
int factorial=1;
for(int i=1;i<=n-1;i++)
factorial*=i;
int num,reminder;
while(true)
{
num=(k-1)/factorial;
reminder=(k-1)%factorial;
int j=0;
while(num--)
{
while(a[j]==0)
j++;
j++;
}
while(a[j]==0)
j++;
char temp='0'+a[j];
a[j]=0;
s+=temp;
n--;
if(n==0)
return s;
k=reminder+1;
factorial/=n;
}
}
};
[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)设num=(k-1)/factorial,factorial是1至n-1的乘积。可以知道第一个数就是从1到n中第num+1大的数,然后将reminder=(k-1)%factorial作为下一轮的k,这时求num不再需要让k-1。
2)按照上述方式不断的求下一轮的数字,将其添加到返回字符串s的结尾处,并将已经添加的数字置为0,这个时候寻找第num+1大的数时要记得忽略掉之前已经添加的数。
3)如此循环往复,直到n=0.
class Solution {
public:
string getPermutation(int n, int k) {
if(n==1)
return "1";
string s="";
int *a=new int
;
for(int i=0;i<n;i++)
{
a[i]=i+1;
}
int factorial=1;
for(int i=1;i<=n-1;i++)
factorial*=i;
int num,reminder;
while(true)
{
num=(k-1)/factorial;
reminder=(k-1)%factorial;
int j=0;
while(num--)
{
while(a[j]==0)
j++;
j++;
}
while(a[j]==0)
j++;
char temp='0'+a[j];
a[j]=0;
s+=temp;
n--;
if(n==0)
return s;
k=reminder+1;
factorial/=n;
}
}
};
相关文章推荐
- 全排列算法的非递归实现与递归实现的方法(C++)
- 全排列
- 字符数组全排列
- 字符全排列算法
- 全排列的递归实现
- 关于全排列
- 如何生成全排列
- leetcode Two Sum
- leetcode Median of Two Sorted Arrays
- leetcode Longest Substring Without Repeating Characters
- leetcode Add Two Numbers
- leetcode Longest Palindromic Substring
- [LeetCode] Populating Next Right Pointers in Each Node
- [LeetCode] Populating Next Right Pointers in Each Node II
- [LeetCode] Distinct Subsequences
- [LeetCode] Flatten Binary Tree to Linked List
- [LeetCode] Path Sum
- [LeetCode] Path Sum II
- [LeetCode] Minimum Depth of Binary Tree - BFS