313. Super Ugly Number
Difficulty: Medium
Topics: Math, Heap
Similar Questions:
Problem:
Write a program to find the nth
super ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes
of size k
.
Example:
Input: n = 12,primes
=[2,7,13,19]
Output: 32 Explanation:[1,2,4,7,8,13,14,16,19,26,28,32]
is the sequence of the first 12 super ugly numbers givenprimes
=[2,7,13,19]
of size 4.
Note:
1
is a super ugly number for any givenprimes
.- The given numbers in
primes
are in ascending order. - 0 <
k
≤ 100, 0 <n
≤ 106, 0 <primes[i]
< 1000. - The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
Solutions:
class Solution {
public:
struct UglyNumber{
int val;
int prime;
int index;
UglyNumber(int val, int prime, int index) {
this->val = val;
this->prime = prime;
this->index = index;
}
bool operator>(const UglyNumber& other) const {
return val*prime > other.val*other.prime;
}
};
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> dp(n, 0);
dp[0] = 1;
priority_queue<UglyNumber, vector<UglyNumber>, greater<UglyNumber>> pq;
for (auto prime : primes) {
pq.push({1, prime, 0});
}
for (int i = 1; i < n; ++i) {
do {
UglyNumber ugly = pq.top(); pq.pop();
dp[i] = ugly.val * ugly.prime;
pq.push({dp[ugly.index + 1], ugly.prime, ugly.index + 1});
} while (pq.top().val * pq.top().prime == dp[i]); // DO WHILE!
}
return dp[n-1];
}
};