刷題-力扣-386. 字典序排數
阿新 • • 發佈:2022-04-18
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/lexicographical-numbers
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
給你一個整數 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]
提示:
- 1 <= n <= 5 * 104
題目分析
- 根據題目描述,按照字母序排列[1,n]
- 深度優先搜尋,假設cur表示當前數字,若cur10不大於n,令cur=cur10,否則cur+1
- 邊界條件,若cur+1大於n,則令cur=cur/10;若cur的個位數為9,即cur+1是10的倍數,令cur=cur/10。執行該步驟直到cur的個位數不為9。
- 例如,n為3000,cur為2889(下一位289、2890),cur自增變為2890,而2890應該出現在289的後面。
程式碼
class Solution { public: vector<int> lexicalOrder(int n) { std::vector<int> nums; int cur = 1; for (int i = 0; i < n; ++i) { nums.emplace_back(cur); if (cur * 10 > n) { // 若cur為2889,cur自增變為2890,而2890應該出現在289的後面,所以2889/10 while (cur + 1 > n || cur % 10 == 9) { cur /= 10; } ++cur; } else { cur *= 10; } } return nums; } };