第五章 - 高频考题(中等)
1906. 查询差绝对值的最小值
Increasing Digits

题目地址(475. Increasing Digits)

题目描述

1
Given an integer n, return the number of positive integers of length n such that the digits are strictly increasing.
2
3
Example 1
4
Input
5
n = 2
6
Output
7
36
8
Explanation
9
We have 12, 13, 14, ..., 89.
10
11
Example 2
12
Input
13
n = 1
14
Output
15
9
Copied!

前置知识

  • 动态规划

思路

动态规划问题的关键就是:假设部分子问题已经解决了,并仅仅考虑局部,思考如何将已解决的子问题变成更大的子问题,这样就相当于向目标走进了一步。
我们可以定义状态 dp[i][j], i 表示数字的位数,j 表示数字的结尾数字。
于是转移方程就是:dp[i][j] += dp[i - 1][k],其中 k 是所有小于 j 的非负整数。最后只要返回 dp[n-1] 的和即可。
初始化的时候,由于题目限定了整数,因此需要初始化除了第一位的所有情况都为 1。

关键点

  • 数位 DP

代码

代码支持:Python3
Python3 Code:
1
class Solution:
2
def solve(self, n):
3
dp = [[0] * 10 for _ in range(n)]
4
dp[0] = [0] + [1] * 9
5
6
for i in range(1, n):
7
for j in range(1, 10):
8
for k in range(j):
9
dp[i][j] += dp[i - 1][k]
10
return sum(dp[-1])
Copied!
复杂度分析
令 n 为数组长度。
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。