【剑指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个丑数。

    上一篇:JavaBase-IO流-标准输入,输出流、打印流、数据流
    下一篇:SSH学习笔记(1)__Struts2_基本概念

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2026年06月01日 11时24分40秒