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]

更新於:2020年4月30日

226 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.