# 386. Lexicographical Numbers

## 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.

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]


Constraints:

• 1 <= n <= 5 * 104

## Solutions

DFS.

• class Solution {
public List<Integer> lexicalOrder(int n) {
List<Integer> ans = new ArrayList<>();
int v = 1;
for (int i = 0; i < n; ++i) {
if (v * 10 <= n) {
v *= 10;
} else {
while (v % 10 == 9 || v + 1 > n) {
v /= 10;
}
++v;
}
}
return ans;
}
}

• class Solution {
public:
vector<int> lexicalOrder(int n) {
vector<int> ans;
int v = 1;
for (int i = 0; i < n; ++i) {
ans.push_back(v);
if (v * 10 <= n)
v *= 10;
else {
while (v % 10 == 9 || v + 1 > n) v /= 10;
++v;
}
}
return ans;
}
};

• class Solution:
def lexicalOrder(self, n: int) -> List[int]:
v = 1
ans = []
for i in range(n):
ans.append(v)
if v * 10 <= n:
v *= 10
else:
while v % 10 == 9 or v + 1 > n:
v //= 10
v += 1
return ans


• func lexicalOrder(n int) []int {
var ans []int
v := 1
for i := 0; i < n; i++ {
ans = append(ans, v)
if v*10 <= n {
v *= 10
} else {
for v%10 == 9 || v+1 > n {
v /= 10
}
v++
}
}
return ans
}

• /**
* @param {number} n
* @return {number[]}
*/
var lexicalOrder = function (n) {
let ans = [];
function dfs(u) {
if (u > n) {
return;
}
ans.push(u);
for (let i = 0; i < 10; ++i) {
dfs(u * 10 + i);
}
}
for (let i = 1; i < 10; ++i) {
dfs(i);
}
return ans;
};


• impl Solution {
fn dfs(mut num: i32, n: i32, res: &mut Vec<i32>) {
if num > n {
return;
}
res.push(num);
for i in 0..10 {
Self::dfs(num * 10 + i, n, res);
}
}

pub fn lexical_order(n: i32) -> Vec<i32> {
let mut res = vec![];
for i in 1..10 {
Self::dfs(i, n, &mut res);
}
res
}
}


• function lexicalOrder(n: number): number[] {
const ans: number[] = [];
let v = 1;
for (let i = 0; i < n; ++i) {
ans.push(v);
if (v * 10 <= n) {
v *= 10;
} else {
while (v % 10 === 9 || v === n) {
v = Math.floor(v / 10);
}
++v;
}
}
return ans;
}