热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数字与数学5:丑数

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数字与数学5:丑数相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了数字与数学5:丑数相关的知识,希望对你有一定的参考价值。






LeetCode263和264是两道关于丑数的问题,一听名字挺邪乎。看一下要求:

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例2:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。

LeetCode263是让你判断一个数是不是丑数,264是让你判断前n个丑数。

如果 n 不是正整数(即小于等于 0):必然不是丑数,直接返回 false。如果 n是正整数:我们对 n执行 2 3 5 的整除操作即可,直到 nn 被除干净,如果 nn 最终为 1 说明是丑数,否则不是丑数。

这里有一点需要想明白,2 3 5 先除哪一个都是可以的,因为乘法本身具有交换律。所以代码就是:

class Solution
public boolean isUgly(int n)
if (n <&#61; 0) return false;
while (n % 2 &#61;&#61; 0) n /&#61; 2;
while (n % 3 &#61;&#61; 0) n /&#61; 3;
while (n % 5 &#61;&#61; 0) n /&#61; 5;
return n &#61;&#61; 1;

第二个题&#xff0c;我们可以通过一个个计算 &#xff0c;然后遍历来寻找&#xff0c;但是这样的问题也很明显 &#xff0c;那就是计算次数太多了&#xff0c;效率不高。

一般涉及到固定n的时候&#xff0c;都要考虑一下能否使用堆来实现&#xff0c;而且遵循”找第K小用大&#xff0c;找第大用小“的原则&#xff0c;这里是要找第K大&#xff0c;所以我们就尝试用最小堆试一下。

初始时堆为空。首先将最小的丑数 11 加入堆。

每次取出堆顶元素 xx&#xff0c;则 xx 是堆中最小的丑数&#xff0c;由于 2x, 3x, 5x2x,3x,5x 也是丑数&#xff0c;因此将 2x, 3x, 5x2x,3x,5x 加入堆。

上述做法会导致堆中出现重复元素的情况。为了避免重复元素&#xff0c;可以使用哈希集合去重&#xff0c;避免相同元素多次加入堆。

在排除重复元素的情况下&#xff0c;第 n 次从最小堆中取出的元素即为第 n个丑数。

class Solution
public int nthUglyNumber(int n)
int[] factors &#61; 2, 3, 5;
Set seen &#61; new HashSet();
PriorityQueue heap &#61; new PriorityQueue();
seen.add(1L);
heap.offer(1L);
int ugly &#61; 0;
for (int i &#61; 0; i long curr &#61; heap.poll();
ugly &#61; (int) curr;
for (int factor : factors)
long next &#61; curr * factor;
if (seen.add(next))
heap.offer(next);



return ugly;

这个题还可以使用dp来做&#xff0c;后面再说。





推荐阅读
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
author-avatar
手机用户2502907707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有