package com.freetymekiyan.algorithms.level.medium; import java.util.ArrayList; import java.util.List; /** * Given an integer n, return 1 - n in lexicographical order. * <p> * For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9]. * <p> * Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000. */ public class LexicographicalNumbers { /** * DFS. * Search for the next possible number to add to result. * 1 * / \ * 10 ... 19 * / / \ * 100 ... 190...199 */ public List<Integer> lexicalOrder(int n) { List<Integer> res = new ArrayList<>(n); for (int i = 1; i < 10; i++) { dfs(i, n, res); } return res; } private void dfs(int curr, int n, List<Integer> res) { if (curr > n) { return; } res.add(curr); for (int i = 0; i < 10; i++) { int next = 10 * curr + i; if (next > n) { // Early prune return; } dfs(next, n, res); } } }