Medium
题目描述
如果一个整数的每一位数字都比前一位数字大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
解题思路
这道题要求找出给定范围内的所有顺次数。顺次数的特点是每一位数字都比前一位大1,比如123、234、1234等。
解法分析:
枚举法(推荐): 由于顺次数的特殊性质,我们可以直接生成所有可能的顺次数。对于每个起始数字1-9,我们可以依次添加下一个连续数字来构造顺次数。比如从1开始可以得到12、123、1234等,从2开始可以得到23、234、2345等。
BFS/DFS生成: 也可以使用队列或递归的方式,从每个起始数字开始,不断添加下一个连续数字,直到超出范围。
具体实现思路:
- 对于每个起始数字i(1≤i≤9),构造以i开头的所有顺次数
- 从当前数字开始,不断乘以10并加上下一个连续数字
- 当下一个数字超过9或生成的数字超过high时停止
- 将所有在[low, high]范围内的顺次数收集起来并排序
由于顺次数的数量很有限(最多只有36个),直接枚举生成是最简单有效的方法。
代码实现
class Solution {
public:
vector<int> sequentialDigits(int low, int high) {
vector<int> result;
for (int i = 1; i <= 9; i++) {
int num = i;
int nextDigit = i + 1;
while (nextDigit <= 9) {
num = num * 10 + nextDigit;
if (num >= low && num <= high) {
result.push_back(num);
}
if (num > high) break;
nextDigit++;
}
}
sort(result.begin(), result.end());
return result;
}
};
class Solution:
def sequentialDigits(self, low: int, high: int) -> List[int]:
result = []
for i in range(1, 10):
num = i
next_digit = i + 1
while next_digit <= 9:
num = num * 10 + next_digit
if low <= num <= high:
result.append(num)
if num > high:
break
next_digit += 1
return sorted(result)
public class Solution {
public IList<int> SequentialDigits(int low, int high) {
var result = new List<int>();
for (int i = 1; i <= 9; i++) {
int num = i;
int nextDigit = i + 1;
while (nextDigit <= 9) {
num = num * 10 + nextDigit;
if (num >= low && num <= high) {
result.Add(num);
}
if (num > high) break;
nextDigit++;
}
}
result.Sort();
return result;
}
}
var sequentialDigits = function(low, high) {
const result = [];
for (let i = 1; i <= 9; i++) {
let num = i;
let nextDigit = i + 1;
while (nextDigit <= 9) {
num = num * 10 + nextDigit;
if (num >= low && num <= high) {
result.push(num);
}
if (num > high) break;
nextDigit++;
}
}
return result.sort((a, b) => a - b);
};
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(1) - 最多生成36个顺次数,常数时间 |
| 空间复杂度 | O(1) - 除了返回结果,只使用常数额外空间 |