题目描述
如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1
,那么这个数就是一个「步进数」。
例如,321
是一个 步进数,而 421
不是。
给你两个整数,low
和 high
,请你找出在 [low, high]
范围内的所有 步进数,并返回 排序后 的结果。
示例 1:
输入:low = 0, high = 21
输出:[0,1,2,3,4,5,6,7,8,9,10,12,21]
示例 2:
输入:low = 10, high = 15
输出:[10,12]
提示:
0 <= low <= high <= 2 * 109
解法
方法一:BFS
首先,如果 $low$ 为 $0$,那么我们需要将 $0$ 加入答案中。
接下来,我们创建一个队列 $q$,并将 $1 \sim 9$ 加入队列中。然后我们不断从队列中取出元素,记当前元素为 $v$,如果 $v$ 大于 $high$,那么我们就停止搜索;如果 $v$ 在 $[low, high]$ 的范围内,那么我们将 $v$ 加入答案中。然后,我们需要将 $v$ 的最后一位数字记为 $x$,如果 $x \gt 0$,那么我们将 $v \times 10 + x - 1$ 加入队列中;如果 $x \lt 9$,那么我们将 $v \times 10 + x + 1$ 加入队列中。重复上述操作,直到队列为空。
时间复杂度 $O(10 \times 2^{\log M})$,空间复杂度 $O(2^{\log M})$,其中 $M$ 为 $high$ 的位数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution:
def countSteppingNumbers(self, low: int, high: int) -> List[int]:
ans = []
if low == 0:
ans.append(0)
q = deque(range(1, 10))
while q:
v = q.popleft()
if v > high:
break
if v >= low:
ans.append(v)
x = v % 10
if x:
q.append(v * 10 + x - 1)
if x < 9:
q.append(v * 10 + x + 1)
return ans
|
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 | class Solution {
public List<Integer> countSteppingNumbers(int low, int high) {
List<Integer> ans = new ArrayList<>();
if (low == 0) {
ans.add(0);
}
Deque<Long> q = new ArrayDeque<>();
for (long i = 1; i < 10; ++i) {
q.offer(i);
}
while (!q.isEmpty()) {
long v = q.pollFirst();
if (v > high) {
break;
}
if (v >= low) {
ans.add((int) v);
}
int x = (int) v % 10;
if (x > 0) {
q.offer(v * 10 + x - 1);
}
if (x < 9) {
q.offer(v * 10 + x + 1);
}
}
return ans;
}
}
|
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 | class Solution {
public:
vector<int> countSteppingNumbers(int low, int high) {
vector<int> ans;
if (low == 0) {
ans.push_back(0);
}
queue<long long> q;
for (int i = 1; i < 10; ++i) {
q.push(i);
}
while (!q.empty()) {
long long v = q.front();
q.pop();
if (v > high) {
break;
}
if (v >= low) {
ans.push_back(v);
}
int x = v % 10;
if (x > 0) {
q.push(v * 10 + x - 1);
}
if (x < 9) {
q.push(v * 10 + x + 1);
}
}
return ans;
}
};
|
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 | func countSteppingNumbers(low int, high int) []int {
ans := []int{}
if low == 0 {
ans = append(ans, 0)
}
q := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for len(q) > 0 {
v := q[0]
q = q[1:]
if v > high {
break
}
if v >= low {
ans = append(ans, v)
}
x := v % 10
if x > 0 {
q = append(q, v*10+x-1)
}
if x < 9 {
q = append(q, v*10+x+1)
}
}
return ans
}
|
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 | function countSteppingNumbers(low: number, high: number): number[] {
const ans: number[] = [];
if (low === 0) {
ans.push(0);
}
const q: number[] = [];
for (let i = 1; i < 10; ++i) {
q.push(i);
}
while (q.length) {
const v = q.shift()!;
if (v > high) {
break;
}
if (v >= low) {
ans.push(v);
}
const x = v % 10;
if (x > 0) {
q.push(v * 10 + x - 1);
}
if (x < 9) {
q.push(v * 10 + x + 1);
}
}
return ans;
}
|