📜  n位步进数的数量|空间优化的解决方案

📅  最后修改于: 2021-04-21 23:37:01             🧑  作者: Mango

给定n,找到n位步进数的计数。如果所有相邻数字的绝对差为1,则该数字称为步进数。321是步进数,而421不是。

例子:

Input : 2
Output : 17
The numbers are 10, 12, 21, 
23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 
78, 87, 89, 98.

Input : 1
Output : 10
The numbers are 0, 1, 2, 3, 
4, 5, 6, 7, 8, 9.

在上一篇文章中,讨论了需要O(n)辅助空间的解决方案。解决问题所需的辅助空间可以得到优化。二维dp数组dp [i] [j]表示长度i和最后一位j的步进数的计数。对于数字j,从数字j – 1和j + 1获得计数。递归关系为dp [i] [j] = dp [i-1] [j-1] + dp [i-1] [j +1] 。请注意,当前长度i的答案仅取决于i –1。因此,可以使用一维dp数组,其中对于给定的i,dp [j]存储长度为i的以数字j结尾的步进数的计数。在将dp数组更新为给定长度i之前,将长度为i – 1的结果存储在另一个数组prev中,然后使用prev数组更新dp数组。

下面是上述方法的实现:

C++
// CPP program to calculate the number of
// n digit stepping numbers.
#include 
using namespace std;
  
// function that calculates the answer
long long answer(int n)
{
    // dp[j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    int dp[10];
  
    // To store result of length i - 1
    // before updating dp[j] for length i.
    int prev[10];
  
    // if n is 1 then answer will be 10.
    if (n == 1)
        return 10;
  
    // Initialize values for count of
    // digits equal to 1.
    for (int j = 0; j <= 9; j++)
        dp[j] = 1;
  
    // Compute values for count of digits
    // more than 1.
    for (int i = 2; i <= n; i++) {
        for (int j = 0; j <= 9; j++) {
            prev[j] = dp[j];
        }
  
        for (int j = 0; j <= 9; j++) {
  
            // If ending digit is 0
            if (j == 0)
                dp[j] = prev[j + 1];
  
            // If ending digit is 9
            else if (j == 9)
                dp[j] = prev[j - 1];
  
            // For other digits.
            else
                dp[j] = prev[j - 1] + prev[j + 1];
        }
    }
  
    // stores the final answer
    long long sum = 0;
    for (int j = 1; j <= 9; j++)
        sum += dp[j];
    return sum;
}
  
// driver program to test the above function
int main()
{
    int n = 2;
    cout << answer(n);
    return 0;
}


Java
// Java program to calculate the number of
// n digit stepping numbers.
class GFG
{
      
// function that calculates the answer
static long answer(int n)
{
    // dp[j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    int[] dp = new int[10];
  
    // To store result of length i - 1
    // before updating dp[j] for length i.
    int[] prev = new int[10];
  
    // if n is 1 then answer will be 10.
    if (n == 1)
        return 10;
  
    // Initialize values for count of
    // digits equal to 1.
    for (int j = 0; j <= 9; j++)
        dp[j] = 1;
  
    // Compute values for count of digits
    // more than 1.
    for (int i = 2; i <= n; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            prev[j] = dp[j];
        }
  
        for (int j = 0; j <= 9; j++)
        {
  
            // If ending digit is 0
            if (j == 0)
                dp[j] = prev[j + 1];
  
            // If ending digit is 9
            else if (j == 9)
                dp[j] = prev[j - 1];
  
            // For other digits.
            else
                dp[j] = prev[j - 1] + prev[j + 1];
        }
    }
  
    // stores the final answer
    long sum = 0;
    for (int j = 1; j <= 9; j++)
        sum += dp[j];
    return sum;
}
  
// Driver code
public static void main (String[] args) 
{
    int n = 2;
    System.out.println(answer(n));
}
}
  
// This code is contributed by mits


Python3
# Python3 program to calculate the number of
# n digit stepping numbers.
  
# function that calculates the answer
def answer(n) :
  
    # dp[j] stores count of i digit
    # stepping numbers ending with digit j.
    dp = [0] * 10
  
    # To store resu1lt of length i - 1
    # before updating dp[j] for length i.
    prev = [0] * 10
  
    # if n is 1 then answer will be 10.
    if (n == 1):
        return 10
  
    # Initialize values for count of
    # digits equal to 1.
    for j in range(0, 10) :
        dp[j] = 1
  
    # Compute values for count of digits
    # more than 1.
    for i in range(2, n + 1): 
        for j in range (0, 10): 
            prev[j] = dp[j]
  
        for j in range (0, 10):
          
            # If ending digit is 0
            if (j == 0):
                dp[j] = prev[j + 1]
  
            # If ending digit is 9
            elif (j == 9) :
                dp[j] = prev[j - 1]
  
            # For other digits.
            else :
                dp[j] = prev[j - 1] + prev[j + 1]
          
    # stores the final answer
    sum = 0
    for j in range (1, 10):
        sum = sum + dp[j]
    return sum
  
# Driver Code
n = 2
print(answer(n))
  
# This code is contributed by ihritik


C#
// C# program to calculate the number of
// n digit stepping numbers.
using System;
  
class GFG
{
      
// function that calculates the answer
static long answer(int n)
{
    // dp[j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    int[] dp = new int[10];
  
    // To store result of length i - 1
    // before updating dp[j] for length i.
    int[] prev = new int[10];
  
    // if n is 1 then answer will be 10.
    if (n == 1)
        return 10;
  
    // Initialize values for count of
    // digits equal to 1.
    for (int j = 0; j <= 9; j++)
        dp[j] = 1;
  
    // Compute values for count of digits
    // more than 1.
    for (int i = 2; i <= n; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            prev[j] = dp[j];
        }
  
        for (int j = 0; j <= 9; j++)
        {
  
            // If ending digit is 0
            if (j == 0)
                dp[j] = prev[j + 1];
  
            // If ending digit is 9
            else if (j == 9)
                dp[j] = prev[j - 1];
  
            // For other digits.
            else
                dp[j] = prev[j - 1] + prev[j + 1];
        }
    }
  
    // stores the final answer
    long sum = 0;
    for (int j = 1; j <= 9; j++)
        sum += dp[j];
    return sum;
}
  
// Driver code
static void Main()
{
    int n = 2;
    Console.WriteLine(answer(n));
}
}
  
// This code is contributed by mits


PHP


输出:
17

时间复杂度: O(N)
辅助空间: O(1)