计算指定范围内的优美数字

2025年3月17日 | 阅读 7 分钟

问题陈述

正整数若满足以下两个条件,则被认为是“美丽”的

数字中偶数位的数量等于奇数位的数量。

该数字能被给定的整数 k 整除。

我们的任务是计算并返回包含在包含性范围 [low, high] 内的美丽数字的总数。

Java 方法 1:使用暴力破解

输出

Counting Beautiful Numbers in a Specified Range

代码解释

  • 该代码定义了一个 Java 类,用于计算指定范围 [l, h] 内具有给定步长 k 的“美丽整数”。辅助方法会迭代范围内的不同 10 的幂,计算偶数位和奇数位数量相等的整数。numberOfBeautifulIntegers 方法通过调用特定 10 的幂的辅助方法来计算总数。
  • 一个特殊情况可以优化某些输入值的计算结果。主方法接收用户输入的范围和步长,然后显示计算出的计数。

时间复杂度

  • numberOfBeautifulIntegers 方法的时间复杂度为 O((h - l) * log(h)),主要由遍历数字范围及其数字的嵌套循环决定。

空间复杂度

  • 空间复杂度为 O(1),因为算法使用恒定的额外空间,主要用于迭代和计数变量,与输入大小无关。
  • 辅助方法 contribute to the overall time complexity,而主要的空间复杂度源于输入和输出变量。

Java 方法 2:使用动态规划

输出

Counting Beautiful Numbers in a Specified Range

代码解释

该代码计算给定范围 [low, high] 内具有指定步长 k 的“美丽整数”的数量。它使用动态规划和递归。递归函数 f 探索所有可能的数字组合,并考虑奇偶性等约束。记忆化通过存储先前计算的结果来优化过程。numberOfBeautifulIntegers 方法初始化低界和高界的计算,然后将结果相减以获得指定范围内的计数。其逻辑涉及

  • 迭代数字的各位。
  • 根据条件更新计数。
  • 高效地存储和检索中间结果以提高整体效率。

时间复杂度

  • 递归涉及一个循环,该循环最多运行到最大数字值(最多 9)。因此,时间复杂度为 O(N * D * 10 * 21 * 21),其中 N 是输入范围中的数字数量,D 是最大数字值(10 位)。

空间复杂度

  • 空间复杂度由记忆化表 dp 的存储需求决定。记忆化表具有基于输入数字长度的维度,以及与递归函数状态相关的其他因子。
  • 空间复杂度为 O(N * 2 * 2 * 21 * 21),其中 N 是输入数字的长度。

Java 方法 3:使用分治法

输出

Counting Beautiful Numbers in a Specified Range

代码解释

  • 分治法通过递归地划分输入范围,将计算美丽数字的任务分解为子问题。该算法计算左右两半的美丽数字的数量,然后合并结果。它利用逐位处理,计算每个数字的范围。
  • 基本情况处理个位数,一个辅助函数高效地计算 10 的幂。通过划分范围和征服子问题,该算法降低了复杂性并优化了计算。递归结构有效地探索了整个范围,计算出美丽数字。

时间复杂度

  • 分治算法的时间复杂度为 O(log(high)),因为它通过数字递归地划分范围,每个级别对应于输入数字中的一个数字。

空间复杂度

空间复杂度为 O(log(high)),这是由于递归调用堆栈,其中每个级别代表一个数字的处理。该算法维护最少量的额外空间,主要用于变量和中间计算。