264.丑数II
思路:优先队列(小顶堆)
1.将最小丑数 1 放入队列
2.每次从队列取出最小值 x,然后将 x 所对应的丑数 2x、3x 和 5x 进行入队。
3.对步骤 2 循环多次,第 n 次出队的值即是答案。
为了防止同一丑数多次进队,我们需要使用哈希表(数据结构 set )来记录入过队列的丑数。
class Solution {
public:
int nthUglyNumber(int n) {
//小顶堆
priority_queue<long,vector<long>,greater<long>> q;
unordered_set<long> s;
int nums[]={2,3,5};
//最小丑数1放入哈希表和优先队列
s.insert(1);
q.push(1);
for(int i=1;i<=n;i++){
long x=q.top();
q.pop();
//第n次pop是第n大的丑数
if (i == n)
return (int)x;
for(int j=0;j<3;j++){
long tmp=nums[j]*x;
if(!s.count(tmp)){
q.push(tmp);
s.insert(tmp);
}
}
}
return -1;
}
};