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);
}
}
};