题解使用了深度优先搜索(DFS)和动态规划的方法,结合位操作和记忆化来解决问题。核心思路是递归地构建符合条件的整数,同时确保不会超过给定的上限 n。递归函数 dfs(i, isOne, isLimit) 考虑当前正在处理的比特位索引 i,isOne 表示前一个比特位是否是1,isLimit 表示当前位是否受到 n 的限制。如果当前位 i 等于二进制表示的长度,说明已构建完成一个有效的整数,返回1。函数中,up 变量根据 isLimit 决定当前位能取的最大值。当上一位不是1且当前位可取1时,会继续递归探索。使用 @cache 装饰器对递归结果进行缓存,以避免重复计算。
时间复杂度: O(log n)
空间复杂度: O(log n)
class Solution:
def findIntegers(self, n: int) -> int:
s = str(bin(n))[2:] # 将 n 转换为二进制字符串,去掉前缀'0b'
@cache
def dfs(i, isOne, isLimit):
if i == len(s): # 如果已处理完所有位,返回1
return 1
res = 0
up = s[i] if isLimit else '1' # 根据是否受限决定当前位能取的最大值
res += dfs(i+1, False, isLimit and up == '0') # 探索放置0的情况
if not isOne and up == '1': # 如果前一位不是1且当前位可以放1,则探索放置1的情况
res += dfs(i+1, True, isLimit)
return res
return dfs(0, False, True) # 从第0位开始,没有前一位,且受限于 n