386.字典序排数
思路
递归:
- 从样例中可以发现规律,开头的数字只有 1 到 9 开始,所以可以每次遍历第一个数,然后判断需不需要在以这个开头的数后面添加新的数。
- 递归只需要执行添加数的操作即可。
代码
递归:
class Solution {
public:
vector<int> res;
void dfs(int u, int n) {
if (u > n) return ;
res.push_back(u);
for (int i = 0; i <= 9; i++) {
dfs(u * 10 + i, n);
}
}
vector<int> lexicalOrder(int n) {
for (int i = 1; i <= 9; i++) dfs(i, n);
return res;
}
};
迭代:
class Solution {
public:
vector<int> res;
vector<int> lexicalOrder(int n) {
for (int i = 0, j = 1; i < n; i++) {
res.push_back(j);
if (j * 10 <= n) {
j *= 10;
} else {
while (j % 10 == 9 || j + 1 > n) j /= 10;
j++;
}
}
return res;
}
};