【LeetCode】386. Lexicographical Numbers 字典序排數(Medium)(JAVA)
阿新 • • 發佈:2020-12-31
技術標籤:Leetcode演算法leetcodejava資料結構面試
【LeetCode】386. Lexicographical Numbers 字典序排數(Medium)(JAVA)
題目地址: https://leetcode.com/problems/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.
題目大意
給定一個整數n, 返回從1到n的字典順序。
例如,
給定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。
請儘可能的優化演算法的時間複雜度和空間複雜度。 輸入的資料n小於等於5,000,000。
解題方法
- 要按字典序排序的話,肯定是先把所有 1 開頭的先排,再 2 開頭的
- 先計算所有 1 開頭的數
1 -> 1 * 10 + 0, 1 * 10 + 1, ..., 1 * 10 + 9 / \ (1 * 10 + 0) * 10 + 0, (1 * 10 + 0) * 10 + 1, ..., (1 * 10 + 0) * 10 + 9
- 採用遞迴的形式計算,先放入 1, 再放入 10 + i, 在 10 + 1 之前先計算 100 + i,不斷遞迴,直到 n 為止
class Solution { public List<Integer> lexicalOrder(int n) { List<Integer> list = new ArrayList<>(); for (int i = 1; i < 10; i++) { if (i > n) break; list.add(i); lH(list, n, i); } return list; } public void lH(List<Integer> list, int n, int num) { num *= 10; for (int i = 0; i < 10; i++) { if (num + i > n) break; list.add(num + i); lH(list, n, num + i); } } }
執行耗時:2 ms,擊敗了96.39% 的Java使用者
記憶體消耗:44.2 MB,擊敗了61.26% 的Java使用者