登录/注册

丑数

更多

丑数(Ugly Number)是指只包含质因数 2、3 和 5 的正整数。例如,1、2、3、4、5、6、8、9、10、12 等是丑数,而 7、14 等不是(因为包含其他质因数)。通常将 1 视为第一个丑数。

计算第 n 个丑数的方法

使用动态规划结合三指针法高效生成丑数序列:

  1. 初始化:定义数组 dp 存储丑数,dp[0] = 1(第一个丑数)。三个指针 p2p3p5 均初始化为 0,分别表示下一个待乘以 2、3、5 的丑数位置。
  2. 生成后续丑数:对于每个位置 i(从 1 到 n-1):
    • 计算候选值:num2 = dp[p2] * 2num3 = dp[p3] * 3num5 = dp[p5] * 5
    • 取最小值:dp[i] = min(num2, num3, num5)
    • 更新指针:若 dp[i] 等于某个候选值,则对应指针加 1(若同时等于多个,则多个指针都加 1)。
  3. 返回结果dp[n-1] 即为第 n 个丑数。

示例(计算第 10 个丑数)

代码实现(Python)

def nthUglyNumber(n: int) -> int:
    dp = [1] * n
    p2, p3, p5 = 0, 0, 0
    for i in range(1, n):
        num2 = dp[p2] * 2
        num3 = dp[p3] * 3
        num5 = dp[p5] * 5
        dp[i] = min(num2, num3, num5)
        if dp[i] == num2: p2 += 1
        if dp[i] == num3: p3 += 1
        if dp[i] == num5: p5 += 1
    return dp[-1]

# 测试
print(nthUglyNumber(10))  # 输出: 12

算法特点

此方法高效避免了逐个数字检查的冗余计算,直接按顺序生成丑数。

真随机和伪随机的区别

随机数在当前程序运行环境中是一种常用参数,目前主要分为两种,伪随机数和真随机数,本期我们就来讲一下二者的区别。

2025-08-27 17:46:52

核心线程和最大线程怎么设置

核心线程数和最大线程数是Java线程池中重要的参数,用来控制线程池中线程的数量和行为。正确地设置这两个参数可以优化系统的性能和资源利用率。本文将详细介绍核心线程

2023-12-01 13:50:09

同构的概念

今天看到一个比较有意思的概念,叫做同构数。同构数是一个数字,它的平方数与数字本身的尾数相同。 例如,25是一个同构

2023-10-07 16:21:32

显实验电源的制作

数显实验电源的制作(ups电源技术维修)-数显实验电源的制作下载,需要的自行下载!

资料下载 张敏 2021-09-29 14:47:46

Python字符统计函数程序

Python字符数统计函数程序免费下载。

资料下载 姚小熊27 2021-05-25 14:35:25

基于可变形CNN的显仪表分割与识别方法

目前,对于数显仪表的识别,多采用传统的图像处理及机器学习等方法,在复杂多变的应用场景中,其对字符、数字的识别准确率低,难以满足实时应用的要求。针对以上问题,将传统图像处理技术与深度学习方法相结合,提

资料下载 佚名 2021-05-10 11:14:06

使用51单片机把4位16进制转成10进制的方法和程序免费下载

本文档的主要内容详细介绍的是使用51单片机把4位16进制数转成10进制数的方法和程序免费下载。

资料下载 无人岛 2019-08-23 17:30:00

如何进行ASCII码和十六进制的转换

本文档的主要内容详细介绍的是如何使用51单片机进行ASCII码和十六进制数的转换资料免费下载题目:用查表法将一位十六进制数转换为ASCII码,入口参数放在内部RAM 50H中,出口参数在R0中。

资料下载 吴藩 2019-07-08 17:41:00

核心线程和最大线程区别

核心线程数和最大线程数区别 核心线程数是线程池中一直存在的线程数,不会被

2023-06-01 09:33:35

系列算法详解

最近读者群里有个读者跟我私信,说去面试微软遇到了一系列和数学相关的算法题,直接懵圈了。我看了下题目,发现这些题其实就是 LeetCode 上面「丑数」系列问题的修改版。

2022-09-14 11:40:11

7天热门专题 换一换
相关标签