思路:
参照https://discuss.leetcode.com/topic/17348/explain-like-i-m-five-java-solution-in-o-n大神的解法. 每次从左到右确定一位数值, 该数值就是下标是k / fact[n - i]的商的元素. 然后结果串添加并且数字pool串删除该数字, 再更新计算k到下一轮排列的序号.
string getPermutation(int n, int k) {
vector<int> fact(n + 1, 1);
// 初始化阶乘数组, 节省些时间
for (int i = 1; i <= n; i++)
fact[i] = i * fact[i - 1];
// 初始化1 - n的字符串
string nums(n, '0');
for (int i = 0; i < nums.length(); i++)
nums[i] += i + 1;
// 下标从0开始, 所以k--
k--;
string res = "";
for (int i = 1; i <= n; i++) {
// 确定当前位在nums中的下标
int index = k / fact[n - i];
res += nums[index];
// 从nums中删掉那个数字
nums.erase(nums.begin() + index);
// 算出下一轮排列的序号
k -= index * fact[n - i];
}
return res;
}