题目描述
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
1、“123”
2、“132”
3、“213”
4、“231”
5、“312”
6、“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例
示例一:
输入: n = 3, k = 3
输出: "213"
示例二:
输入: n = 4, k = 9
输出: "2314"
心路历程
感觉有点只可意会不可言传…,就是从高位往下决定排列的哪一个。先把n个数字存入一个vector中,然后再看这一次的能减去几个(n-1)!,然后能减去的个数就是当下这一位的。然后再把这个元素从vector中pop出去
代码
class Solution {
public:
string getPermutation(int n, int k){
vector<int> nums; // 存放有哪些数
string ans = "";
for(int i=1; i<n+1; i++){
nums.push_back(i);
}
for(int i=0; i<n; i++){
int factorial = 1;
for(int j=2; j<nums.size(); j++)
factorial = factorial * j;
int countNum = 0;
// 计算把数组中的第几个pop出去
while(k-factorial>0){
k = k-factorial;
countNum++;
}
int choose_num = nums[countNum];
nums.erase(nums.begin()+countNum);//删除第一个元素
// leetcode这里是to_string, CLION是toString
ans = ans + to_string(choose_num);
}
return ans;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-sequence