題目: 給定 n 和 k,返回 1..n 的全排列中第 k 個(按字典序)。n ≤ 9。
ceil(k / (n-1)!) 小的未用數字。k' = k - (idx-1)*(n-1)! 個排列。fact[i] = i!。idx = k / fact[n-i-1],k %= fact[n-i-1]。vector nums 存可用數字,選取後 erase。class Solution {
public:
string getPermutation(int n, int k) {
vector fact(n+1, 1);
for (int i = 1; i <= n; i++) fact[i] = fact[i-1] * i;
vector nums;
for (int i = 1; i <= n; i++) nums.push_back(i);
k--; // 0-based
string res;
for (int i = n; i >= 1; i--) {
int idx = k / fact[i-1];
res += char('0' + nums[idx]);
nums.erase(nums.begin() + idx);
k %= fact[i-1];
}
return res;
}
};
時間 O(n²)(erase 為 O(n)),空間 O(n)。n ≤ 9 瞬間通過。