386. Lexicographical Numbers

1. Description

Given an integer n, return all the numbers in the range [1, n] sorted in lexicographical order.
You must write an algorithm that runs in O(n) time and uses O(1) extra space.

2. Example

Example 1

Input: n = 13
Output: [1,10,11,12,13,2,3,4,5,6,7,8,9]

Example 2

Input: n = 2
Output: [1,2]

3. Constraints

  • 1 <= n <= 5 * $10^4$

4. Solutions

Time complexity: O(n)
Space complexity: O(1)

class Solution {
public:
    vector<int> lexicalOrder(const int n) {
        vector<int> numbers(n);
        int num = 1;
        for (int i = 0; i < n; ++i) {
            numbers[i] = num;

            if (num * 10 <= n) {
                num *= 10;
            } else {
                while (num % 9 == 0 || num >= n) {
                    num /= 10;
                }

                ++num;
            }
        }

        return numbers;
    }
};
comments powered by Disqus