文章目录
- 1. 题目
- 2. 解题
- 2.1 DFS
- 2.2 BFS
1. 题目
返回所有长度为 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]提示:
1 <= N <= 9
0 <= K <= 9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/numbers-with-same-consecutive-differences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 简单的模板题,一起加油!
2.1 DFS
class Solution {vector<int> ans;
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(1,N,K,i);return ans;}void dfs(int count, int N, int K, int num){if(count == N)//位数够了{ans.push_back(num);return;}int last = num%10;if(last+K <= 9)dfs(count+1, N, K, num*10+last+K);if(last-K >= 0 && K != 0) // K 为0,跟上面重复了dfs(count+1, N, K, num*10+last-K);}
};
8 ms 8.2 MB
2.2 BFS
class Solution {vector<int> ans;
public:vector<int> numsSameConsecDiff(int N, int K) {if(N == 1)return {0,1,2,3,4,5,6,7,8,9};queue<int> q;for(int i = 1; i <= 9; ++i)q.push(i);int cur, lastbit, size, len = 1;while(!q.empty()){size = q.size();while(size--){cur = q.front();q.pop();if(len == N)//位数够了ans.push_back(cur);lastbit = cur%10;if(lastbit+K <= 9 && len < N)q.push(cur*10+lastbit+K);if(lastbit-K >= 0 && len < N && K != 0) // K 为0,跟上面重复了q.push(cur*10+lastbit-K);}++len;//位数+1}return ans;}
};
4 ms 7.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!