C ++中具有相同连续差异的数字
假设我们必须找到所有长度为N的非负整数,以使每两个连续数字之间的绝对差为K。我们必须记住,答案中的每个数字除数字0本身外,都不得带有前导零。我们可以以任何顺序返回答案。因此,如果N = 3且K = 7,则输出将为[181,292,707,818,929],在这里我们可以看到070不是有效数字,因为它有一个前导零。
为了解决这个问题,我们将遵循以下步骤-
创建一个称为dp的矩阵,其大小将为n + 1,将1到9填充到dp [1]中
对于我,范围是1到N – 1
x:= dp [i,j]
lastNum:= x的最后一位
位数:= lastNum + k
如果数字在0到9的范围内,并且没有访问(x * 10 +数字),则
位数:= lastNum – K
如果数字在0到9的范围内,并且没有访问(x * 10 +数字),则
将(10 * x +数字)插入dp [i + 1]
将10 * x +数字插入访问数组
将(10 * x +数字)插入dp [i + 1]
将10 * x +数字插入访问数组
定义一个称为Visited的集合
对于范围从0到dp [i]的j
如果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));
}
输入值
37
输出结果
[181,292,707,818,929]
以上是 C ++中具有相同连续差异的数字 的全部内容, 来源链接: utcz.com/z/352568.html