题目大意
返回所有长度为 N 且满足其每两个连续位上的数字之间的差的绝对值为 K 的非负整数。
请注意,除了数字 0 本身之外,答案中的每个数字都不能有前导零。例如,01 因为有一个前导零,所以是无效的;但 0 是有效的。
你可以按任何顺序返回答案。
示例 1:
输入:N = 3, K = 7
输出:[181,292,707,818,929]
解释:注意,070 不是一个有效的数字,因为它有前导零。
示例 2:
输入:N = 2, K = 1
输出:[10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]
解题思路
记录当前数字和当前数字的个位数字num(也可以取模得到),根据num+/-K计算下一轮的数字即可。
class Solution {
private:
vector<int> res;
public:
vector<int> numsSameConsecDiff(int N, int K) {
if (N == 1){
return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
}
for(int i = 1; i <= 9; ++i)
dfs(N, K, i, i);
return res;
}
void dfs(int N, int K, int curNum, int lastNum){
// 如果仅有1个数字长度,则直接返回当前数字
if (N == 1){
res.push_back(curNum);
return ;
}
// 否则,根据末尾元素计算
if (lastNum + K <= 9)
dfs(N - 1, K, curNum * 10 + lastNum + K, lastNum + K);
// 为了防止K=0的情况上下两个递归计算结果相同,因此多添加一个条件K!=0
if (lastNum - K >= 0 && K != 0)
dfs(N - 1, K, curNum * 10 + lastNum - K, lastNum - K);
}
};