leetcode967.连续差相同的数字

题目大意

返回所有长度为 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);
    }
};

你可能感兴趣的:(leetcode算法题解)