[LeetCode] 5081. 步进数
Posted qiu_jiaqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 5081. 步进数相关的知识,希望对你有一定的参考价值。
题目描述
如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1
,那么这个数就是一个「步进数」。
例如,321
是一个步进数,而 421
不是。
给你两个整数,low
和 high
,请你找出在 [low, high]
范围内的所有步进数,并返回 排序后 的结果。
示例 :
输入:low = 0, high = 21
输出:[0,1,2,3,4,5,6,7,8,9,10,12,21]
提示:
0 <= low <= high <= 2 * 10^9
分析与代码
- 一开始想到的是先把所有步进数求出来放到一个集合,然后再遍历取其中
>=low && <= high
的数添加到结果集合 result,最后排下序。 - 求步进数是用 DFS 的方法,以 1 到 9 开头,每次把当前数乘 10 加上个位数加 1 或减 1。注意一下个位为 0 和 9 的特殊情况就好。
- 0 特殊处理。
代码:
class Solution
public List<Integer> countSteppingNumbers(int low, int high)
List<Integer> list = new ArrayList<>();
list.add(0);
for (int i = 1; i <= 9; i++)
dfs(list, i);
List<Integer> result = new ArrayList<>();
for (int num : list)
if (num >= low && num <= high)
result.add(num);
Collections.sort(result);
return result;
public void dfs(List<Integer> list, int cur)
list.add(cur);
if (cur > Integer.MAX_VALUE / 10)
return;
int r = cur % 10;
if (r != 9)
dfs(list, cur * 10 + r + 1);
if (r != 0)
dfs(list, cur * 10 + r - 1);
解法一、DFS
- 可以不求出所有结果,只在小于 high 范围内递归,在 DFS 过程中只添加符合要求的结果。
代码:
class Solution
public List<Integer> countSteppingNumbers(int low, int high)
List<Integer> result = new ArrayList<>();
if (low == 0)
result.add(0);
for (int i = 1; i <= 9; i++)
dfs(result, i, low, high);
Collections.sort(result);
return result;
public void dfs(List<Integer> result, int cur, int low, int high)
if (cur >= low && cur <= high)
result.add(cur);
if (cur > high / 10)
return;
int r = cur % 10;
if (r != 9 && cur * 10 + r + 1 <= high)
dfs(result, cur * 10 + r + 1, low, high);
if (r != 0 && cur * 10 + r - 1 <= high)
dfs(result, cur * 10 + r - 1, low, high);
解法二、BFS
- 先把 1 到 9 添加到队列,然后每次取出队列中的数,符合要求就添加到结果集合 result,并把下一位范围内的步进数加到队列。
代码:
class Solution
public List<Integer> countSteppingNumbers(int low, int high)
Queue<Integer> queue = new LinkedList<>();
List<Integer> result = new ArrayList<>();
if (low == 0)
result.add(0);
for (int i = 1; i <= 9; i++)
queue.offer(i);
while (!queue.isEmpty())
int cur = queue.poll();
if (cur >= low && cur <= high)
result.add(cur);
if (cur > high / 10)
continue;
int r = cur % 10;
if (r != 9 && cur * 10 + r + 1 <= high)
queue.offer(cur * 10 + r + 1);
if (r != 0 && cur * 10 + r - 1 <= high)
queue.offer(cur * 10 + r - 1);
Collections.sort(result);
return result;
小结
就是以 1 到 9 开头,求出步进数,可以用 DFS,也可以用 BFS。
以上是关于[LeetCode] 5081. 步进数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode692. 前K个高频单词 / 剑指 Offer 50. 第一个只出现一次的字符 / 剑指 Offer 51. 数组中的逆序对 / 2. 两数相加