LeetCode60——Permutation Sequence
来源:互联网 发布:长沙软件职业技术学院 编辑:程序博客网 时间:2024/06/16 00:20
LeetCode60——Permutation Sequence
又是全排列的问题。
循环调用next_permutation()这个方法测试过超时。
这个题参考了:http://blog.csdn.net/linhuanmars/article/details/22028697
简单的说一下。
对于1,2,3这样的序列来说,假设要求它的第5个全排列是3,1,2
我们采取这种办法:由于序列的长度是3,那么我们从索引为0的位置开始,添加数字。
对于索引0来说,它可以从1,2,3中选,由于他们按照字典序排列。
所以结论:1,2,3的第5个全排列,他的的第一个数(索引为0)是3。
这个结论是这么算出来的:
当固定第一个数时,剩下的数一共有(n-1)!种组合。
结合例子:
那么,当第一个数为1时有2种情况。
当第一个数为2时有两种情况。
那么当k=5时自然而然就将第一个数填为3了。
好,现在我们要填写第二个数字。那么首先,我们要从原来的序列(1,2,3)中剔除3。
然后我们要看k=5时在(n-1)!内部排第几,我们用5%2=1,在固定第一个数后,剩下的序列中,我们的序列排在第1位,回到上面的步骤,我们就能填出第2个数字为1了。
代码:
class Solution {public:string getPermutation(int n, int k) {vector<char>nums;string result;int count = 1;k = k - 1;for (int i = 1; i <= n; i++)nums.push_back(i + '0');for (int i = 2; i < n; i++)count *= i;//每一组数量 (n-1)!while (n--){int index = k / count;//第一个数k = k%count;//更新k的值,剔除第一个数后的全排列的位置result += nums[index];nums.erase(nums.begin() + index);if (n == 0)break;count /= n;//计算完一次也需要将(n-1)!更新到(n-2)!}return result;}};
0 0
- LeetCode60——Permutation Sequence
- LeetCode60:Permutation Sequence
- Leetcode60 Permutation Sequence
- LeetCode60. Permutation Sequence
- leetcode60. Permutation Sequence
- leetcode60~Permutation Sequence
- LEETCODE60. Permutation Sequence
- Leetcode60 Permutation Sequence (string)
- leetcode60-Permutation Sequence(求指定位置的排列)
- LeetCode——Permutation Sequence
- Algorithms—60.Permutation Sequence
- leetcode 060 —— Permutation Sequence
- Leetcode题集——permutation-sequence
- LeetCode——60. Permutation Sequence
- leetcode——60——Permutation Sequence
- Leetcode刷题记—— 60. Permutation Sequence(排列序列)
- 2.1.13 —线性表—Permutation Sequence
- Permutation Sequence
- LinuxCNC+EtherCAT(5)之关于LinuxCNC和EMC
- Android性能专项测试
- 求1~n与x互质的数的个数(6个题、容斥原理)
- 04-树4 是否是同一棵二叉搜索树
- 欢迎使用CSDN-markdown编辑器
- LeetCode60——Permutation Sequence
- html
- Android----我所收集的Android学习资源
- 学习笔记--- ImageSwitcher控件
- SQL数据库中数据的定义和数据查询
- 胖虎谈ImageLoader框架(一)
- 关于升级到win10后扬声器经常没有声音的问题
- 你真的了解ClassLoader吗
- LeetCode:Reverse Linked List