Open In App

Number of n digit stepping numbers | Space optimized solution

Last Updated : 22 Jun, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given n, find the count of n digit Stepping numbers. A number is called a stepping number if all adjacent digits have an absolute difference of 1. 321 is a Stepping Number while 421 is not.
Examples: 
 

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.

 

In the previous post, a solution that requires O(n) auxiliary space is discussed. The auxiliary space required to solve the problem can be optimized. The 2-D dp array dp[i][j] represents count of stepping number of length i and last digit j. For a digit j the count is obtained from digit j – 1 and j + 1. The recurrence relation is dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] . Observe that the answer for current length i depends only on i – 1. So a 1-D dp array can be used in which for a given i, dp[j] stores count of stepping numbers of length i ending with digit j. Before updating dp array for a given length i, store the result for length i – 1 in another array prev, then update dp array using prev array.
Below is the implementation of above approach: 
 

C++




// CPP program to calculate the number of
// n digit stepping numbers.
#include <bits/stdc++.h>
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




<?php
// PHP program to calculate the number of
// n digit stepping numbers.
 
// function that calculates the answer
function answer($n)
{
    // dp[j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    $dp = array_fill(0, 10, 0);
 
    // To store result of length i - 1
    // before updating dp[j] for length i.
    $prev = array_fill(0, 10, 0);;
 
    // 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 = 0; $j <= 9; $j++)
        $dp[$j] = 1;
 
    // Compute values for count of digits
    // more than 1.
    for ($i = 2; $i <= $n; $i++)
    {
        for ($j = 0; $j <= 9; $j++)
        {
            $prev[$j] = $dp[$j];
        }
 
        for ($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
    $sum = 0;
    for ($j = 1; $j <= 9; $j++)
        $sum += $dp[$j];
    return $sum;
}
 
    // Driver program to test the above function
    $n = 2;
    echo answer($n);
 
// This code is contributed by mits
?>


Javascript




<script>
 
 
// Javascript program to calculate the number of
// n digit stepping numbers.
 
// function that calculates the answer
function answer(n)
{
    // dp[j] stores count of i digit
    // stepping numbers ending with digit
    // j.
    var dp = Array(10);
 
    // To store result of length i - 1
    // before updating dp[j] for length i.
    var prev = Array(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 (var j = 0; j <= 9; j++)
        dp[j] = 1;
 
    // Compute values for count of digits
    // more than 1.
    for (var i = 2; i <= n; i++) {
        for (var j = 0; j <= 9; j++) {
            prev[j] = dp[j];
        }
 
        for (var 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
    var sum = 0;
    for (var j = 1; j <= 9; j++)
        sum += dp[j];
    return sum;
}
 
// driver program to test the above function
var n = 2;
document.write( answer(n));
 
</script>


Output: 

17

 

Time Complexity: O(N) 
Auxiliary Space: O(1), since no extra space has been taken.
 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads