题目链接:LeetCode 60. 第k个排列
题意:
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123""132""213""231""312""321"
给定 n 和 k,返回第 k 个排列。
说明:
- 给定 n 的范围是 [1, 9]。
- 给定 k 的范围是[1, n!]。
解题思路:
解题思路有好几个,但是找规律无疑是耗时最少的,而且占用内存会很小
就分析案例1,以1开头的数字有2个,2开头的有2个,3开头的有2个,会发现:
以某个数开头的数字就是剩余后面数字的排列,个数为 (n-1)! 【这玩意代表阶乘,不是单纯的感叹号】
接下来判断第k个字符串 中每一位的数字 ,num = k / (n-i)! ,ch[num] 就是当前位置对应的数字 k = k % (n-i)!
class Solution {
public:
string getPermutation(int n, int k) {
string ans = "";
int f[15];
f[0] = 1;
vector<char> ch={'1','2','3','4','5','6','7','8','9'};
for(int i = 1; i <= n; i++) {
f[i] = f[i-1] * i; // 先求阶乘
}
k--; // 先减一,数组从0开始
for(int i = 0; i < n; i++) {
int p = k / f[n-i-1]; // 计算字符串k的第i位
ans.push_back(ch[p]);
ch.erase(ch.begin()+p); // 消去这个数字
k = k % f[n-i-1]; // 计算下一位
}
return ans;
}
};


被折叠的 条评论
为什么被折叠?



