字典序排数

110 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给你一个整数 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

思路

这是一道经典的dfs排序问题,可以使用dfs深度优先搜索可以解决。如果我们将 h 位的所有整数看做如下所示 h 层的 k 叉树,范围内的所有整数的字典序实际上就是这棵 k 叉树的先序遍历顺序。因此,我们可以从根节点 1 开始进行深度优先搜索(注意第一位不能为0),在搜索过程中不断将当前整数添加至答案中,再从 2 开始搜索,以此类推。如果搜索过程中当前数大于 n,直接返回。简单理解:只需要先找出高位1的所有答案再找高位2,高位head作为dfs形参,dfs形参head,head作为高位部分,不是的话更新答案并dfs。

代码

class Solution {
public:
​
    int n;
    vector<int> res;
    vector<int> lexicalOrder(int n) {
        this -> n = n;
        for(int i = 1;i <= 9;i ++)
        {
            if(i > n) break;
            res.push_back(i);
            dfs(i);
        }
        return res;
    }
​
    void dfs(int head)
    {
        head = head * 10;
        // 遍历从0到9,加上当前的头看是否满足条件,满足条件就加入结果集合中
        for(int i = 0;i <= 9;i ++)
        {
            if(head + i > n) return;
            res.push_back(head + i);
            dfs(head + i);
        }
    }
};