【算法】力扣【动态规划、数位DP】233. 数字 1 的个数
题目描述
本文旨在解析力扣算法题233:“数字 1 的个数”。难度等级:困难。该算法问题要求计算在非负整数n以内(包括n),所有数位上数字1出现的次数。这是一道数位DP模板题。
这里的解法参考了灵神(灵茶山艾府)的第二版数位DP。
输入输出示例
示例 1:
输入:n = 13
输出:6
解释: 数字1在以下数字中出现:1, 10, 11, 12, 13,其中11中数字1出现两次,合计6次。
示例 2:
输入:n = 0
输出:0
解释: 没有数字1出现。
提示
- 0 ≤ n ≤ 1 0 9 0 \leq n \leq 10^9 0≤n≤109
解题思路
解决这个问题的关键是使用数位动态规划(数位DP)。数位DP是一种处理数位统计问题的有效方式。基本思想是将数字从高位到低位逐位考虑,利用历史信息减少计算量。其主要步骤包括定义状态、状态转移以及记忆化搜索。
代码解析
以下是题解的代码部分,我们将按函数的逐行解释:
第一部分
class Solution:
def countDigitOne(self, n: int)