1215. 步进数
大约 2 分钟
---
1215. 步进数
- 标签:广度优先搜索、数学
- 难度:中等
题目链接
题目大意
描述:给定两个整数 和 。如果一个整数相邻两位上的数字之差的绝对值恰好为 ,则称这个数为步进数。
要求:返回 范围内的所有步进数,按升序排列。
说明:
- 。
示例:
- 示例 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]解题思路
思路 1:BFS 枚举
1. 核心思想
一个步进数可以通过"在末尾添加一位差值恰好为 的数字"来生成。例如 是步进数,末尾是 ,可以在后面加 ()或 ()得到 或 ,这两个仍然是步进数。
因此可以用 BFS 从 到 开始生成所有步进数( 也单独处理)。每次从队列中取出一个数 ,取最后一位 ,尝试在后面添加 和 (如果在 到 之间),生成新数 。如果新数 ,加入队列和结果集。
2. 具体步骤
第 1 步:如果 ,先将 加入结果集。
第 2 步:将 到 加入队列。
第 3 步:BFS 循环:
- 从队列中取出 。
- 如果 ,跳过。
- 如果 ,加入结果集(BFS 保证了数字从小到大)。
- 取最后一位 。
- 如果 ,尝试加 :,如果 ,入队。
- 如果 ,尝试加 :,如果 ,入队。
第 4 步:将结果集排序(BFS 的顺序不一定严格升序)并返回。
注意:也可以用 DFS 或直接迭代生成,BFS/DFS 的思路类似。
思路 1:代码
from collections import deque
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:
num = q.popleft()
if num > high:
continue
if num >= low:
ans.append(num)
last = num % 10
if last > 0:
nxt = num * 10 + (last - 1)
if nxt <= high:
q.append(nxt)
if last < 9:
nxt = num * 10 + (last + 1)
if nxt <= high:
q.append(nxt)
return ans思路 1:复杂度分析
- 时间复杂度:,其中 是 范围内的步进数个数。步进数的数量远小于 (因为每步最多生成 个后继,最多 位数字,总数不超过 个)。
- 空间复杂度:,需要存储所有步进数。