K-th Smallest in Lexicographical Order
HardTrie
Solution
export function findKthNumber(n: number, k: number): number {
let num = 1;
let remain = k - 1;
while (0 < remain) {
const steps = countSteps(n, num, num + 1);
if (steps <= remain) {
num += 1;
remain -= steps;
} else {
num *= 10;
remain -= 1;
}
}
return num;
}
function countSteps(n: number, prefix1: number, prefix2: number) {
let steps = 0;
while (prefix1 <= n) {
steps += Math.min(n + 1, prefix2) - prefix1;
prefix1 *= 10;
prefix2 *= 10;
}
return steps;
}
Complexity
- Time:
O(log(N^2))
- Space:
O(logN)