2376. 统计特殊整数
2024-09-20 17:09:36
Problem: 2376. 统计特殊整数
记录新学到的知识点,思路见灵茶山艾府
思路
位运算和集合论
通过将位运算和集合论结合,可以用来表示数位状态,用来作为数位dp的一部分使用。
具体方法是,对于从右到左第i
位数,如果为1就代表i
这个数在集合中。对于要枚举的范围不大(例如数位D,范围为0-9)的数来说,可以很方便地用一个整数来存储数位的访问状态。
取出第i
位数和加入第i
位数都是$O(D)$的时间复杂度。设集合为x,则取出放入操作可以用位运算求解:
- 取出:
x >> i & 1
- 放入:
1 << i | x
数位dp
通过记忆化搜索来找出所有可能的状态,这样可以把需要遍历的情况压缩到状态数乘以单个状态计算时间的大小,状态数在本体中为位数(很小)乘以$O(2^D)$,后者是集合可能有的所有情况。同时单个状态的计算时间通常是很小的。这样就大大减小了计算的量,可以高效地找出所有符合条件的情况。
对于数位问题的技巧
1.对于不能超过最大数n
的解决方式
设置一个isLimit
标志,表示当前位置是否受到约束,即如果超过s[i]
则非法。若isLimit
为true,则当前可以遍历的数就存在一个上限s[i]
,否则为9。在记忆化搜索的过程中维护和更新这个标志。
2.对于前置不能存在0,又可能为空的解决方式
设置一个isNum
标志,表示前一位是否有填数字。如果前一位空,则这一位可以空(直接遍历下一位),也可以填1-9;如果前一位不空,则这一位只能填0-9。
复杂度
- 时间复杂度: $O(mD2^D)$。其中
m
为s
的长度,D
为10。 - 空间复杂度: $O(m2^D)$。
Code
1 | class Solution { |