题目描述
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
解题思路
方法:DFS递归
时间复杂度:$O(10^n)$
空间复杂度:$O(10^n)$
代码如下
class Solution {
public:
char digital[10] = {'0','1','2','3','4','5','6','7','8','9'};
vector<int> res;
int total_bits;
char num[100];
vector<int> printNumbers(int n) {
total_bits = n;
// num = new char[n];
dfs(0);
// delete[] num;
res.erase(res.begin());
return res;
}
void dfs(int index){
if(index == total_bits){
res.push_back(atoi(&num[0]));
}
else{
for(int i=0; i<10; i++){
num[index] = digital[i];
dfs(index+1);
}
}
}
};
解法分析
这道题乍一看很简单,题目也没有要求考虑大数条件。但如果考虑了大数条件,就会变得稍微复杂起来了。本题在考虑大数情况下,采用$DFS$递归,主要思路是先固定高位,向低位递归,当个位数被固定,再固定十位0~9
,按顺序开启递归,直到到达最高位,终止递归。
主要步骤
- 定义一个
n
位数的字符数组,用来存放最终结果。 - 先将所有要用到的数组或者变量放到全局中,以免递归的时候多次传递。
- 递归传入一个索引
index
,刚开始索引为0,待到索引为n
的时候,结束本次递归。 - 对每一位按照
0~9
的顺序依次分配字符。
解法注意点
- 最后生成的字符串需要通过
atoi
函数变成整数。 - 去掉第一项(题目要求开头不为0)