📝个人主页:五敷有你
🔥系列专栏:算法分析与设计
⛺️稳中求进,晒太阳
题目
给你一个整数
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 通常被视为丑数
思路
方法一:最小堆
要得到从小到大的第 nnn 个丑数,可以使用最小堆实现。
初始时堆为空。首先将最小的丑数 111 加入堆。
每次取出堆顶元素 xxx,则 xxx 是堆中最小的丑数,由于 2x,3x,5x 也是丑数,因此将 2x,3x,5x 加入堆。
上述做法会导致堆中出现重复元素的情况。为了避免重复元素,可以使用哈希集合去重,避免相同元素多次加入堆。
在排除重复元素的情况下,第 n 次从最小堆中取出的元素即为第 n 个丑数。
代码实现
class Solution {
public int nthUglyNumber(int n) {
int[] factors={2,3,5};
Set<Long> set=new HashSet();
PriorityQueue<Long> queue=new PriorityQueue();
set.add(1l);
queue.offer(1l);
int ugly=0;
for(int i=0;i<n;i++){
long cur=queue.poll();
ugly=(int)cur;
for(int factor:factors){
long next=cur*factor;
if(set.add(next)) queue.offer(next);
}
}
return ugly;
}
}
运行结果
时间复杂度:O(nlogn)