首先暴力解法,求出所以的排列, 排序,求第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(); } };