leetcode967.连续差相同的数字

本文探讨了如何找出所有长度为N的非负整数,这些整数的特点是任意两个连续位上的数字之差的绝对值等于给定的K值。通过深度优先搜索(DFS)算法,我们详细介绍了如何避免前导零并确保结果的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

返回所有长度为 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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值