1291.顺次数:打表/枚举

【LetMeFly】1291.顺次数:打表/枚举

力扣题目链接:https://leetcode.cn/problems/sequential-digits/

我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。

请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。

 

示例 1:

输出:low = 100, high = 300
输出:[123,234]

示例 2:

输出:low = 1000, high = 13000
输出:[1234,2345,3456,4567,5678,6789,12345]

 

提示:

  • 10 <= low <= high <= 10^9

解题方法:枚举/打表

枚举

12345678这种顺次数最多有几十个,我们可以枚举所有的顺次数,如果在$low$和$high$之间就加入答案数组,最终排个序返回即可。

如何枚举所有顺次数?首先枚举第一位,然后依次往这个数后面拼接下一位,制止拼接完$9$位置。

打表

不用每个测试用例都重新枚举计算一遍所有的顺次数,直接初始化一个全局变量把所有顺次数存下来,每个测试用例只需要遍历就好了。

时空复杂度

  • 时间复杂度$O(1)$,只有几十个数,可以粗略地将复杂度视为$O(1)$
  • 空间复杂度$O(1)$

AC代码

C++ —— 枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* @LastEditTime: 2026-07-13 21:56:25
*/
class Solution {
public:
vector<int> sequentialDigits(int low, int high) {
vector<int> ans;
for (int i = 1; i <= 9; i++) {
int v = i;
for (int j = i + 1; j <= 9; j++) {
v = v * 10 + j;
if (low <= v && v <= high) {
ans.push_back(v);
}
}
}
sort(ans.begin(), ans.end());
return ans;
}
};

C++ —— 打表

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
/*
* @LastEditTime: 2026-07-13 22:07:09
*/
vector<int> good;

int _ = [] {
for (int i = 1; i <= 9; i++) {
int v = i;
for (int j = i + 1; j <= 9; j++) {
v = v * 10 + j;
good.push_back(v);
}
}
sort(good.begin(), good.end());
return 0;
}();

class Solution {
public:
vector<int> sequentialDigits(int low, int high) {
vector<int> ans;
for (int t : good) {
if (low <=t && t <= high) {
ans.push_back(t);
}
}
return ans;
}
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


1291.顺次数:打表/枚举
https://blog.letmefly.xyz/2026/07/13/LeetCode 1291.顺次数/
作者
发布于
2026年7月13日
许可协议