C++ 中的排列序列
假设集合类似于 [1,2,3,...,n],包含 n! 种唯一的排列。通过按顺序列出和标记所有排列,我们可以获得 n = 3 的序列:["123","132","213","231","312","321"] 因此,如果给定 n 和 k,则返回第 k 个排列序列。n 将介于 1 到 9(包括)之间,而 k 将介于 1 到 n!(包括)。例如,如果 n = 3。
让我们看看步骤 −
- ans := 空字符串,定义大小为 n 的数组 candidates
- 对于从 0 到 n – 1 的 i
- candidates[i] := ((i + 1) + 字符 '0')
- 创建一个名为 fact 的大小为 n + 1 的数组,设置 fact[0] := 1
- 对于从 1 到 n 的 i
- fact[i] := fact[i – 1] * i
- 将 k 减少 1
- 对于从 n – 1 到 0 的 i
- idx := k / fact[i]
- ans := ans + candidates[idx]
- 对于从 idx、idx + 1 到 candidates 大小的 j
- candidates[j] := candidates[j + 1]
- k := k mod fact[i]
- 返回 ans
让我们看看以下实现以获得更好的理解 −
示例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: string getPermutation(int n, int k) { string ans = ""; vector <char> candidates(n); for(lli i = 0; i < n; i++) candidates[i] = ((i + 1) + '0'); vector <lli> fact(n + 1); fact[0] = 1; for(lli i = 1; i <= n; i++) fact[i] = fact[i - 1] * i; k--; for(lli i = n - 1; i >= 0; i--){ lli idx = k / fact[i]; ans += candidates[idx]; for(lli j = idx; j + 1< candidates.size(); j++) candidates[j] = candidates[j + 1]; k = k % fact[i]; } return ans; } }; main(){ Solution ob; cout << ob.getPermutation(4, 9); }
输入
4 9
输出
2314
广告