K-th Smallest in Lexicographical Order

May 9, 2020

Introduction

Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n.

Note: 1 ≤ k ≤ n ≤ 109.

Example:

Input:

n: 13   k: 2

Output:

10

Explanation: The lexicographical order is [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9], so the second smallest number is 10.

Solution

This task is the same as “386. Lexicographical Numbers”, but we also need to skip numbers by using function ‘countNumber’ to have a maximum performance.

func findKthNumber(n int, k int) int {
   return dfs(1, n, k-1)
}

func dfs(root, n, k int) int {

    if k == 0 {
        return root
    }

    count := countNumber(root, n)
    if count > k {
        return dfs(root*10, n, k-1)
    } else {
        return dfs(root+1, n, k-count)
    }
}

func countNumber(root, n int) int {
    son := root+1
    cnt := 0
    for root <= n {
        cnt += min(son, n+1) - root
        root *= 10;
        son *= 10;
    }        
    return cnt
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

Preformance

Runtime: 0 ms, faster than 100.00% of Go online submissions for K-th Smallest in Lexicographical Order.
Memory Usage: 2 MB, less than 100.00% of Go online submissions for K-th Smallest in Lexicographical Order.

comments powered by Disqus

Do you want to know me more private?→Click!