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));
    }

    输入值

    3
    7

    输出结果

    [181,292,707,818,929]