LeetCode[264]丑数II

难度:中等

题目:

给你一个整数 n ,请你找出并返回第 n 丑数
丑数 就是只包含质因数 2 3 和/或 5 的正整数。

示例 1:

输入:n = 10

输出:12

解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。


示例 2:

输入:n = 1

输出:1

解释:1 通常被视为丑数。


提示:

  • 1 <= n <= 1690


Related Topics

  • 哈希表

  • 数学

  • 动态规划

  • 堆(优先队列)


重点!!!解题思路

此题类似LeetCode面试题[17.09]第k个数,想学习此题的另一种解法可点击链接查看
https://blog.csdn.net/m0_57209427/article/details/127242893

第一步:

求集合最值问题我们均可采用堆(优先队列)来解决
由于这个丑数是按升序排列的
且我们所求丑数为数组最后一个(也是数组中最大的一个值)
所以此题我们可以采用小顶堆来解决

第二步:

接下来我们需要生成这个丑数序列
初始值为1,我们先让它乘2,3,5来得出前4为丑数
接下来我们必须让每次计算出来的丑数不能重复
即这基础的3个丑数2,3,5
它们3个只能乘大于或等于自身的素因子才可以生成不重复的丑数序列

第三步:

求得出丑数序列后,我们将其加入到小顶堆中
每次我们都剔除最小得那个值
值到剔除得数量等于给定的值
程序结束,返回此时值即可

源码:

class Solution {
    public int nthUglyNumber(int n) {
        PriorityQueue priorityQueue = new PriorityQueue<>();//由于题中丑数序列最大可以为1690个,所以我们采用long类型来计算
        priorityQueue.offer(1L);
        long ans=0L;
        while (n-->0){
            ans=priorityQueue.poll();
            if (ans%5L==0) priorityQueue.offer(ans*5L);
            else if (ans%3L==0){
                priorityQueue.offer(ans*3L);
                priorityQueue.offer(ans*5L);
            }else {
                priorityQueue.offer(ans*3L);
                priorityQueue.offer(ans*5L);
                priorityQueue.offer(ans*2L);
            }
        }
        return (int) ans;
    }
}

运行结果:

LeetCode[264]丑数II_第1张图片

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

你可能感兴趣的:(算法刷题篇,树结构基础(刷题篇),堆与优先队列,leetcode,算法,数据结构)