386. 字典序排數
阿新 • • 發佈:2022-04-18
386. 字典序排數
難度中等341 收藏 分享 切換為英文 接收動態 反饋
給你一個整數 n
,按字典序返回範圍 [1, n]
內所有整數。
你必須設計一個時間複雜度為 O(n)
且使用 O(1)
額外空間的演算法。
示例 1:
輸入:n = 13
輸出:[1,10,11,12,13,2,3,4,5,6,7,8,9]
示例 2:
輸入:n = 2
輸出:[1,2]
方法一:遞迴
利用二叉樹的思想。可以將其想成一個10叉樹
/** * 利用二叉樹的原理 * @param n * @return */ public List<Integer> lexicalOrder(int n) { List<Integer> ans = new ArrayList<>(); for (int i = 1; i <= Math.min(9, n); i++) { dfs(ans, i, n); } return ans; } void dfs(List<Integer> ans, int tmp, int n) { if (tmp > n) { return; } ans.add(tmp); for (int j = 0; j <= 9; j++) { int num = tmp * 10 + j; // 加上這個,快很多 if (num > n) { break; } dfs(ans, num, n); } }
方法2:深度優先演算法
官方答案
public List<Integer> lexicalOrder(int n) { List<Integer> ans = new ArrayList<>(); int num = 1; for (int i = 0; i < n; i++) { ans.add(num); if (num * 10 <= n) { num *= 10; } else { while (num % 10 == 9 || num + 1 > n) { num /= 10; } num++; } } return ans; }
提示:
1 <= n <= 5 * 10<sup>4</sup>