首先暴力解法,求出所以的排列, 排序,求第k个
class Solution {
public:
void getP(vector<int> num, vector<string> & result, string s)
{
if(num.empty())
{
result.push_back(s);
return ;
}
int t;
for(int i=0;i<num.size();i++)
{
t=num[i];
num.erase(num.begin()+i);
getP(num, result, s+to_string(t));
num.insert(num.begin()+i,t);
}
}
string getPermutation(int n, int k) {
vector<int> num;
for(int i=1;i<=n;i++)
{
num.push_back(i);
}
vector<string> result;
string temp;
getP(num,result,temp);
sort(result.begin(),result.end());
return result[k-1];
}
};
超时。。。
考虑数学归纳法:
n个数有n!个排列组合.
string getPermutation(int n, int k) { /* vector<int> num; for(int i=1;i<=n;i++) { num.push_back(i); } vector<string> result; string temp; getP(num,result,temp); sort(result.begin(),result.end()); return result[k-1]; */ vector<int> factorial = vector<int>(n + 1, 1); for (int i = 1; i < n + 1; ++i) { factorial[i] = factorial[i - 1] * i; } vector<int> nums; for (int i = 1; i < n + 1; ++i) { nums.push_back(i); } vector<int> perm; for (int i = 0; i < n; ++i) { int rank = (k - 1) / factorial[n - i - 1]; k = (k - 1) % factorial[n - i - 1] + 1; // append and remove nums[rank] perm.push_back(nums[rank]); nums.erase(std::remove(nums.begin(), nums.end(), nums[rank]), nums.end()); } // transform a vector<int> to a string std::stringstream result; std::copy(perm.begin(), perm.end(), std::ostream_iterator<int>(result, "")); return result.str(); } };