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:
1is a super ugly number for any givenprimes.- The given numbers in
primesare 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];
}
};