编写一段程序来查找第 n 个超级丑数。
超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。
示例:
输入: n = 12, primes = [2,7,13,19]
输出: 32
解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。
首先我们知道丑数是基于(过去的丑数)和(质因子数组中质因子)的乘积中的最小值。采用最小优先队列实现最小值排在第一个。
使用优先级队列,小顶堆,丑数超级丑数一样一样的解法
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
priority_queue<int,vector<int>,greater<int>> pq;
pq.push(1);
int cnt=1;
unordered_set<long>visited;
while(cnt<n){
int cur=pq.top();
pq.pop();
cnt++;
for(const auto p:primes){
long next = (long)cur*p;
if(!visited.count(next)&&next<=INT_MAX){
visited.insert(next);
pq.push(next);
}
}
}
return pq.top();
}
};