386.字典序排数
链接:386.字典序排数
难度:Medium
标签:深度优先搜索、字典树
简介:给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。
题解 1 - cpp
- 编辑时间:2022-03-21
- 执行用时:16ms
- 内存消耗:11.2MB
- 编程语言:cpp
- 解法介绍:dfs 遍历每一层。
class Solution {
   public:
    vector<int> lexicalOrder(int n) {
        vector<int> ans;
        for (int i = 1; i <= 9; i++) dfs(ans, n, i);
        return ans;
    }
    void dfs(vector<int> &ans, int &max, int num) {
        if (num > max) return;
        ans.push_back(num);
        for (int i = 0; i <= 9; i++) dfs(ans, max, num * 10 + i);
    }
};
题解 2 - cpp
- 编辑时间:2022-04-18
- 执行用时:12ms
- 内存消耗:11.2MB
- 编程语言:cpp
- 解法介绍:dfs。
class Solution {
   public:
    vector<int> lexicalOrder(int n) {
        vector<int> ans;
        for (int i = 1; i <= 9; i++) dfs(ans, n, i);
        return ans;
    }
    void dfs(vector<int> &ans, int &n, int num) {
        if (num > n) return;
        ans.push_back(num);
        for (int i = 0; i <= 9; i++) dfs(ans, n, num * 10 + i);
    }
};
题解 3 - cpp
- 编辑时间:2022-04-18
- 执行用时:8ms
- 内存消耗:10.2MB
- 编程语言:cpp
- 解法介绍:遍历。
class Solution {
   public:
    vector<int> lexicalOrder(int n) {
        vector<int> ans(n);
        int num = 1;
        for (int i = 0; i < n; i++) {
            ans[i] = num;
            if (num * 10 <= n)
                num *= 10;
            else {
                while (num % 10 == 9 || num + 1 > n) num /= 10;
                num++;
            }
        }
        return ans;
    }
};