Number of n digit stepping numbers | Space optimized solution
Last Updated :
22 Jun, 2022
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++
#include <bits/stdc++.h>
using namespace std;
long long answer( int n)
{
int dp[10];
int prev[10];
if (n == 1)
return 10;
for ( int j = 0; j <= 9; j++)
dp[j] = 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 (j == 0)
dp[j] = prev[j + 1];
else if (j == 9)
dp[j] = prev[j - 1];
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
long long sum = 0;
for ( int j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
int main()
{
int n = 2;
cout << answer(n);
return 0;
}
|
Java
class GFG
{
static long answer( int n)
{
int [] dp = new int [ 10 ];
int [] prev = new int [ 10 ];
if (n == 1 )
return 10 ;
for ( int j = 0 ; j <= 9 ; j++)
dp[j] = 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 (j == 0 )
dp[j] = prev[j + 1 ];
else if (j == 9 )
dp[j] = prev[j - 1 ];
else
dp[j] = prev[j - 1 ] + prev[j + 1 ];
}
}
long sum = 0 ;
for ( int j = 1 ; j <= 9 ; j++)
sum += dp[j];
return sum;
}
public static void main (String[] args)
{
int n = 2 ;
System.out.println(answer(n));
}
}
|
Python3
def answer(n) :
dp = [ 0 ] * 10
prev = [ 0 ] * 10
if (n = = 1 ):
return 10
for j in range ( 0 , 10 ) :
dp[j] = 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 (j = = 0 ):
dp[j] = prev[j + 1 ]
elif (j = = 9 ) :
dp[j] = prev[j - 1 ]
else :
dp[j] = prev[j - 1 ] + prev[j + 1 ]
sum = 0
for j in range ( 1 , 10 ):
sum = sum + dp[j]
return sum
n = 2
print (answer(n))
|
C#
using System;
class GFG
{
static long answer( int n)
{
int [] dp = new int [10];
int [] prev = new int [10];
if (n == 1)
return 10;
for ( int j = 0; j <= 9; j++)
dp[j] = 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 (j == 0)
dp[j] = prev[j + 1];
else if (j == 9)
dp[j] = prev[j - 1];
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
long sum = 0;
for ( int j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
static void Main()
{
int n = 2;
Console.WriteLine(answer(n));
}
}
|
PHP
<?php
function answer( $n )
{
$dp = array_fill (0, 10, 0);
$prev = array_fill (0, 10, 0);;
if ( $n == 1)
return 10;
for ( $j = 0; $j <= 9; $j ++)
$dp [ $j ] = 1;
for ( $i = 2; $i <= $n ; $i ++)
{
for ( $j = 0; $j <= 9; $j ++)
{
$prev [ $j ] = $dp [ $j ];
}
for ( $j = 0; $j <= 9; $j ++)
{
if ( $j == 0)
$dp [ $j ] = $prev [ $j + 1];
else if ( $j == 9)
$dp [ $j ] = $prev [ $j - 1];
else
$dp [ $j ] = $prev [ $j - 1] + $prev [ $j + 1];
}
}
$sum = 0;
for ( $j = 1; $j <= 9; $j ++)
$sum += $dp [ $j ];
return $sum ;
}
$n = 2;
echo answer( $n );
?>
|
Javascript
<script>
function answer(n)
{
var dp = Array(10);
var prev = Array(10);
if (n == 1)
return 10;
for ( var j = 0; j <= 9; j++)
dp[j] = 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 (j == 0)
dp[j] = prev[j + 1];
else if (j == 9)
dp[j] = prev[j - 1];
else
dp[j] = prev[j - 1] + prev[j + 1];
}
}
var sum = 0;
for ( var j = 1; j <= 9; j++)
sum += dp[j];
return sum;
}
var n = 2;
document.write( answer(n));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1), since no extra space has been taken.
Share your thoughts in the comments
Please Login to comment...