C++ 中具有相同连续差别的数字
假设我们需要找到所有长度为 N 的非负整数,使得每两个连续数字之间的绝对差值为 K。我们必须记住,答案中的每个数字都不能有前导零,除非数字本身为 0。我们可以按任何顺序返回答案。因此,如果 N = 3 且 K = 7,则输出将为 [181,292,707,818,929],在这里我们可以看到 070 不是一个有效的数字,因为它有一个前导零。
为了解决这个问题,我们将遵循以下步骤:
创建一个名为 dp 的矩阵,其大小为 n + 1,将 1 到 9 填充到 dp[1] 中
对于 i 从 1 到 N – 1
定义一个名为 visited 的集合
对于 j 从 0 到 dp[i] 的大小
x := dp[i, j]
lastNum := x 的最后一位数字
digit := lastNum + k
如果 digit 在 0 到 9 的范围内,并且 (x*10 + digit) 未被访问过,则
将 (10*x + digit) 插入到 dp[i + 1] 中
将 10*x + digit 插入到 visited 数组中
digit := lastNum – K
如果 digit 在 0 到 9 的范围内,并且 (x*10 + digit) 未被访问过,则
将 (10*x + digit) 插入到 dp[i + 1] 中
将 10*x + digit 插入到 visited 数组中
如果 N 为 1,则将 0 插入到 dp[N] 中
返回 dp[N]
让我们看看下面的实现以更好地理解:
示例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<int> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> numsSameConsecDiff(int N, int K) { vector <int> dp[N + 1]; for(int i = 1; i <= 9; i++){ dp[1].push_back(i); } for(int i = 1; i < N; i++){ set <int> visited; for(int j = 0; j < dp[i].size(); j++){ int x = dp[i][j]; int lastNum = x % 10; int digit = lastNum + K; if(digit >= 0 && digit <= 9 && !visited.count(x * 10 + digit)){ dp[i + 1].push_back(x * 10 + digit); visited.insert(x * 10 + digit); } digit = lastNum - K; if(digit >= 0 && digit <= 9 && !visited.count(x * 10 + digit)){ dp[i + 1].push_back(x * 10 + digit); visited.insert(x * 10 + digit); } } } if(N == 1){ dp[N].push_back(0); } return dp[N]; } }; main(){ Solution ob; print_vector(ob.numsSameConsecDiff(3,7)); }
输入
3 7
输出
[181,292,707,818,929]
广告