1. 程式人生 > 其它 >刷題-力扣-386. 字典序排數

刷題-力扣-386. 字典序排數

題目連結

來源:力扣(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. 根據題目描述,按照字母序排列[1,n]
  2. 深度優先搜尋,假設cur表示當前數字,若cur10不大於n,令cur=cur10,否則cur+1
  3. 邊界條件,若cur+1大於n,則令cur=cur/10;若cur的個位數為9,即cur+1是10的倍數,令cur=cur/10。執行該步驟直到cur的個位數不為9。
  4. 例如,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;
    }

};