难度:中等
题目:
给你一个整数 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<Long> 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;
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧