leetcode——60——Permutation Sequence
2016-04-17 13:43
357 查看
The set
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.
这道题最直观的的解法就是先求出所有的排列,然后再从结果中找到第k个值即可,但是很明显会超时。
如果不能先将所有的排列都求出来,那么这道题的目的就是让我们直接找到第k个排列了。
那么如何找到第k个排列?直接要找到规律可能会比较困难,但是可以使用回溯和动态规划的一般方法,即使用用例来分析,从特殊到一般。看看通过这个特殊的用例能不能找到通用的方法,但是使用用例分析可能会由于用例选取的不全而导致遗漏一些情况,这道题做到最后就是用例选取的不全导致改了好久。
取n=3,k=5,那么输出应该是第5个排列”312”。
可以发现n=3时的所有排列中以1开头的排列有2个,以2开头的排列有2个,以3开头的排列有2个。
排列的个数取决于后面的数有多少种排列,这里后面有2个数,排列的个数是2!=2。
于是对于k=5可以这么分析
5/2=2;
5%2=1
即将[123]第0位的数字1和第2位的数字3交换,第0位就处理好了,现在数组变成[321],接着指针移到到第1位,然后将第1位到最后的元素排序,数组变成了[312],然后求[12]中的第1个数。
但是这种求解方法会有一点问题,那就是本来5和6应该都是和第2位交换,但是由于6/2=3,结果变成了第0位和第3位交换,很明显这是错误的,我们应该使用它在结果集中的下标来使用这个元素,对于k=5,实际上是第k-1=4个元素,对于4:
4/2=2;
4%2=0
它表示第0个元素要和第2个元素交换,这时第0个元素就处理好了,然后再在后面的2个元素构成的排列中查询第4%2=0个元素,当所有的元素都处理好了以后,这个数组中的元素就是我们要找的第k个排列了。
[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.
这道题最直观的的解法就是先求出所有的排列,然后再从结果中找到第k个值即可,但是很明显会超时。
如果不能先将所有的排列都求出来,那么这道题的目的就是让我们直接找到第k个排列了。
那么如何找到第k个排列?直接要找到规律可能会比较困难,但是可以使用回溯和动态规划的一般方法,即使用用例来分析,从特殊到一般。看看通过这个特殊的用例能不能找到通用的方法,但是使用用例分析可能会由于用例选取的不全而导致遗漏一些情况,这道题做到最后就是用例选取的不全导致改了好久。
取n=3,k=5,那么输出应该是第5个排列”312”。
可以发现n=3时的所有排列中以1开头的排列有2个,以2开头的排列有2个,以3开头的排列有2个。
排列的个数取决于后面的数有多少种排列,这里后面有2个数,排列的个数是2!=2。
于是对于k=5可以这么分析
5/2=2;
5%2=1
即将[123]第0位的数字1和第2位的数字3交换,第0位就处理好了,现在数组变成[321],接着指针移到到第1位,然后将第1位到最后的元素排序,数组变成了[312],然后求[12]中的第1个数。
但是这种求解方法会有一点问题,那就是本来5和6应该都是和第2位交换,但是由于6/2=3,结果变成了第0位和第3位交换,很明显这是错误的,我们应该使用它在结果集中的下标来使用这个元素,对于k=5,实际上是第k-1=4个元素,对于4:
4/2=2;
4%2=0
它表示第0个元素要和第2个元素交换,这时第0个元素就处理好了,然后再在后面的2个元素构成的排列中查询第4%2=0个元素,当所有的元素都处理好了以后,这个数组中的元素就是我们要找的第k个排列了。
class Solution { public: string getPermutation(int n, int k) { vector<int> nums(n); int data = 1; for (int i = 0; i<n; i++) { nums[i] = i + 1; data *= i + 1; } k--; string res = ""; for (int i = 0; i < n; i++) { data = data / (n - i); int select = k / data; res += ('0' + nums[select]); for (int j = select; j < n-i-1; j++) nums[j] = nums[j + 1]; k = k%data; } return res; } };
相关文章推荐
- 关于别克2016君越(Buick Lacroesse)的音频系统
- StringBuffer_StringBuilder
- 225. Implement Stack using Queues
- hdu 5667 sequence
- iOS UIScrollView和 cell加载子视图偏移64问题
- HDU 5667 Sequence
- ProgressBar 为什么可以在非UI线程中更新进度。
- 为什么说Druid是“最好的数据库连接池”?体现在哪些方面?这是如何实现的? (mybatis是不自带jdbc链接池的)
- Arduino中的数据类型
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
- 斐波那契数列 Fibonacci sequence
- 安装VBox共享文件增强功能VBoxGuestAdditions
- MySQL: table、view、trigger、procedure、index (表、主键、UNIQUE Key、列、索引、视图、触发器、存储过程)查看、修改、更新、删除操作
- 使用fuel6.0自动安装openstack-juno版本(2)
- iOS蓝牙4.0(BLE)-LightBlue与cc2540开发板通信
- HDU5667 sequence 递推求值 (矩阵快速幂)
- [HDU 5667] Sequence (矩阵快速幂+费马小定理)
- HDU 5667 Sequence 矩阵快速幂
- java 集合-ArrayDeque