import java.util.*; /** * NC362 字典序排列 * @author d3y1 */ public class Solution { ArrayList<Integer> result = new ArrayList<>(); /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 程序入口 * * @param n int整型 * @return int整型ArrayList */ public ArrayList<Integer> orderArray (int n) { return solution1(n); // return solution2(n); // return solution3(n); } /** * Trie字典树 * @param n * @return */ private ArrayList<Integer> solution1(int n){ Trie trie = new Trie(); for(int i = 1; i <= n; i++){ trie.insert(String.valueOf(i)); } dfs(trie, ""); return result; } /** * 递归: 前序遍历 * @param trie * @param word */ private void dfs(Trie trie, String word){ if(trie == null){ return; } if(trie.isEnd){ result.add(Integer.valueOf(word)); } for(int i = 0; i <= 9; i++){ dfs(trie.children[i], word+i); } } /** * Trie类 */ private class Trie { private Trie[] children; private boolean isEnd; public Trie() { children = new Trie[10]; isEnd = false; } public void insert(String word) { Trie node = this; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); int index = ch - '0'; if (node.children[index] == null) { node.children[index] = new Trie(); } node = node.children[index]; } node.isEnd = true; } } /** * 迭代 * @param n * @return */ public ArrayList<Integer> solution2(int n) { int number = 1; for (int i = 1; i <= n; i++) { result.add(number); if (number * 10 <= n) { number *= 10; } else { while (number % 10 == 9 || number + 1 > n) { number /= 10; } number++; } } return result; } /** * dfs * @param n * @return */ public ArrayList<Integer> solution3(int n) { // first digit: 1-9 for(int i=1; i<10; i++){ dfs(i, n); } return result; } /** * 递归: 前序遍历 * @param num * @param n */ public void dfs(int num, int n){ if(num > n){ return; } result.add(num); for(int i=0; i<10; i++){ dfs(num*10+i, n); } } }