给定 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 结尾的步进数的计数。在更新给定长度 i 的 dp 数组之前,将长度 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
Javascript
输出:
17
时间复杂度: O(N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。