Lexicographical Numbers
Given an integer n, return 1 - n in lexicographical order.
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.
方法1:
利用排序,把数字按照lexicographical order 排序。但是最后通不过。
1 public class Solution { 2 public List<Integer> lexicalOrder(int n) { 3 List<Integer> list = new ArrayList<>(); 4 if (n < 1) return list; 5 for (int i = 1; i <= n; i++) { 6 list.add(i); 7 } 8 9 Collections.sort(list, new Comparator<Integer>() { 10 @Override 11 public int compare(Integer i1, Integer i2) { 12 return String.valueOf(i1).compareTo(String.valueOf(i2)); 13 } 14 }); 15 return list; 16 } 17 }
方法2:来自leetcode discuss https://discuss.leetcode.com/topic/55377/simple-java-dfs-solution
The idea is pretty simple. If we look at the order we can find out we just keep adding digit from 0 to 9 to every digit and make it a tree. Then we visit every node in pre-order.
1 2 3 ...
/\ /\ /\
10 ...19 20...29 30...39 ....
1 public class Solution { 2 public List<Integer> lexicalOrder(int n) { 3 List<Integer> res = new ArrayList<>(); 4 for (int i = 1; i < 10; ++i) { 5 dfs(i, n, res); 6 } 7 return res; 8 } 9 10 public void dfs(int cur, int n, List<Integer> res) { 11 if (cur > n) return; 12 res.add(cur); 13 for (int i = 0; i < 10; ++i) { 14 dfs(10 * cur + i, n, res); 15 } 16 } 17 }