classSolution: """ @param n: n @param k: the k-th permutation @return: a string, the k-th permutation """ defgetPermutation(self, n, k): # generate factorial list factorial = [1] for i in xrange(1, n + 1): factorial.append(factorial[-1] * i)
nums = range(1, n + 1) perm = [] for i in xrange(n): rank = (k - 1) / factorial[n - i - 1] k = (k - 1) % factorial[n - i - 1] + 1 # append and remove nums[rank] perm.append(nums[rank]) nums.remove(nums[rank]) # combine digits return"".join([str(digit) for digit in perm])
classSolution { public: /** * @param n: n * @param k: the kth permutation * @return: return the k-th permutation */ string getPermutation(int n, int k){ // generate factorial list vector<int> factorial = vector<int>(n + 1, 1); for (int i = 1; i < n + 1; ++i) { factorial[i] = factorial[i - 1] * i; } // generate digits ranging from 1 to n 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, ""));
classSolution { /** * @param n: n * @param k: the kth permutation * @return: return the k-th permutation */ public String getPermutation(int n, int k) { if (n <= 0 && k <= 0) return"";
intfact=1; // generate nums 1 to n List<Integer> nums = newArrayList<Integer>(); for (inti=1; i <= n; i++) { fact *= i; nums.add(i); }
// get the permutation digit StringBuildersb=newStringBuilder(); for (inti= n; i >= 1; i--) { fact /= i; // take care of rank and k intrank= (k - 1) / fact; k = (k - 1) % fact + 1; // ajust the mapping of rank to num sb.append(nums.get(rank)); nums.remove(rank); }
return sb.toString(); } }
源码分析
源码结构分为三步走,
建阶乘数组
生成排列数字数组
从高位到低位计算排列数值
复杂度分析
几个 for 循环,时间复杂度为 \[O(n)\], 用了与 n 等长的一些数组,空间复杂度为 \[O(n)\].