【剑指offer】面试题49:丑数
发布日期:2021-04-30 21:03:35
浏览次数:91
分类:精选文章
本文共 1519 字,大约阅读时间需要 5 分钟。
为了找到丑数列表中的第n个丑数,可以采用广度优先搜索(BFS)策略。这一方法确保生成的丑数是按从小到大的顺序排列,并且避免重复处理。以下是优化后的Java代码:
class Solution { public int nthUglyNumber(int n) { if (n == 0) { return 0; } // 使用优先队列(最小堆)来按顺序生成丑数 PriorityQueue heap = new PriorityQueue<>(); // 记录已处理的丑数,避免重复 Set processed = new HashSet<>(); // 初始化,1是第一个丑数 heap.put(1, 1); processed.add(1); int count = 0; int result = 0; while (!heap.isEmpty()) { int current = heap.poll(); count++; if (count == n) { result = current; break; } // 生成下一个可能的丑数 int next2 = current * 2; if (!processed.contains(next2)) { heap.put(next2, next2); processed.add(next2); } int next3 = current * 3; if (!processed.contains(next3)) { heap.put(next3, next3); processed.add(next3); } int next5 = current * 5; if (!processed.contains(next5)) { heap.put(next5, next5); processed.add(next5); } } return result; }} 解释:
初始化:使用一个最小堆(PriorityQueue)来存储丑数,按从小到大的顺序处理。同时,使用集合(Set)记录已处理的丑数,避免重复。
生成丑数:从堆中取出最小的数,生成其乘以2、3、5的新数。如果新数未被处理过,则将新数加入堆,并标记为已处理。
计数:每次取出一个数,就增加计数器。当计数器达到n时,返回当前数作为第n个丑数。
这种方法确保丑数生成的顺序正确,避免了重复处理,能够高效地找到第n个丑数。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年06月01日 11时24分40秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Redis五种核心数据结构的基本使用与应用场景
2023-02-28
PHPCMS多文件上传和上传数量限制
2023-02-28
phpEnv的PHP集成环境
2023-02-28
PHPExcel一些基本设置总结
2023-02-28
PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
2023-02-28
PHPMailer发送邮件
2023-02-28
phpmailer发送邮件,可以带附件
2023-02-28
phpmyadmin 安装
2023-02-28
phpmyadmin数据库建表及插入
2023-02-28
phprpc简单使用
2023-02-28
phpstorm中Xdebug的使用
2023-02-28
phpstorm中使用svn版本控制器
2023-02-28
phpstorm配置php脚本执行
2023-02-28
PhpStorm配置远程xdebug
2023-02-28
phpStudy安装教程
2023-02-28
phpunit
2023-02-28
phpWhois 项目推荐
2023-02-28
phpwind部署问题
2023-02-28
PHP__call __callStatic
2023-02-28
php一句话图片运行,【后端开发】php一句话图片木马怎么解析
2023-02-28