Problem Statement
leetcode problem link
Solution
class Solution:
def lexicalOrder(self, n: int) -> List[int]:
res = []
curr = 1
for _ in range(n):
res.append(curr)
if curr * 10 <= n:
curr = curr * 10
else:
while curr % 10 == 9 or curr >= n:
curr = curr // 10
curr += 1
return res
Editorial
Approach 1: DFS Approach
class Solution:
def lexicalOrder(self, n: int) -> List[int]:
lexicographical_numbers = []
# Start generating numbers from 1 to 9
for start in range(1, 10):
self._generate_lexical_numbers(start, n, lexicographical_numbers)
return lexicographical_numbers
def _generate_lexical_numbers(
self, current_number: int, limit: int, result: List[int]
):
# If the current number exceeds the limit, stop recursion
if current_number > limit:
return
# Add the current number to the result
result.append(current_number)
# Try to append digits from 0 to 9 to the current number
for next_digit in range(10):
next_number = current_number * 10 + next_digit
# If the next number is within the limit, continue recursion
if next_number <= limit:
self._generate_lexical_numbers(next_number, limit, result)
else:
break # No need to continue if next_number exceeds limit
Approach 2: Iterative Approach
class Solution:
def lexicalOrder(self, n: int) -> List[int]:
lexicographical_numbers = []
current_number = 1
# Generate numbers from 1 to n
for _ in range(n):
lexicographical_numbers.append(current_number)
# If multiplying the current number by 10 is within the limit, do it
if current_number * 10 <= n:
current_number *= 10
else:
# Adjust the current number by moving up one digit
while current_number % 10 == 9 or current_number >= n:
current_number //= 10 # Remove the last digit
current_number += 1 # Increment the number
return lexicographical_numbers