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;
}
};