连续差相同的数字-LeetCode
967. 连续差相同的数字 - Numbers With Same Consecutive Differences
🎯 问题描述(来源于LeetCode)
描述:
返回所有长度为 n 的非负整数(不含前导零),其相邻两个数字的差的绝对值恰好为 k。
可以按任意顺序返回答案。
说明:
n的范围是[2, 9](实际题目中n可能为 1,但本题要求长度为n,且不含前导零,因此n=1时答案为0..9,但通常n≥2)。k的范围是[0, 9]。- 结果中的整数不应有前导零(即第一位不能为 0)。
示例:
- 示例 1:
1 | 输入: n = 3, k = 7 |
- 示例 2:
1 | 输入: n = 2, k = 1 |
💻 解题思路
思路:回溯法(DFS)逐位构建
算法步骤
- 初始化结果列表
ans。 - 定义递归函数
dfs(path),其中path是当前构建的数字字符串列表(或字符串):- 如果
len(path) == n,将path拼接成整数并加入ans,返回。 - 否则,取出当前最后一位数字
last = int(path[-1]),计算下一个可能数字r = last + k和l = last - k。 - 如果
r <= 9,则递归dfs(path + [str(r)])。 - 如果
l != r且l >= 0,则递归dfs(path + [str(l)])。
- 如果
- 枚举第一位数字从
1到9(避免前导零),对每个起始数字调用dfs([str(i)])。 - 返回
ans。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:最坏情况下每个位置最多产生两个分支,因此总状态数约为 ,对于
n ≤ 9完全可行。 - 空间复杂度:,递归栈深度和路径存储。
思考
该解法通过回溯逐位构建数字,利用数学关系 last ± k 生成下一个数字,并自动处理边界条件(0 ≤ digit ≤ 9)。
优点:
- 代码简洁,直接模拟数字构建过程。
- 通过
l != r避免重复添加相同数字(当k=0时,l == r,只添加一次)。 - 首位从 1 到 9 枚举,避免了前导零。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






