题目描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/
题解
递归生成全排列
该题《剑指Offer》是要求打印大数的,所以以字符串存储,dfs 递归生成全排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class Solution { void dfs(int len, int x, string& number, vector<string>& numbers) { if (x == len) { numbers.push_back(number); return; } int start = (x == 0 ? 1 : 0); for (char i = start + '0'; i <= '9'; ++i) { number.push_back(i); dfs(len, x + 1, number, numbers); number.pop_back(); } } public: vector<int> printNumbers(int n) { vector<string> numbers; for(int i = 1; i <= n; ++i) { string number = ""; dfs(i, 0, number, numbers); } vector<int> ret; for (string num : numbers) ret.push_back(stoi(num)); return ret; } };
|
时间复杂度:O(10n) 。生成 10n 个数字,生成每个数字用的时间为 1~n,可看作常数。
空间复杂度:O(10n),不考虑返回空间为 O(n)。
如果考虑返回的空间,O(10n),返回 10n 个字符串,而字符串的长度为 1~n,可看作常数。
如果不考虑返回空间,那递归深度最大为 n,临时存储字符串空间为 n,所以有 O(n) 。