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 given primes = [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.
Approach #1: C++.
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
unordered_map<int, int> mp;
vector<int> nums;
nums.push_back(1);
while (nums.size() != n) {
int temp = INT_MAX;
for (int i = 0; i < primes.size(); ++i) {
temp = min(temp, nums[mp[primes[i]]] * primes[i]);
}
for (int i = 0; i < primes.size(); ++i) {
if (temp == nums[mp[primes[i]]]*primes[i])
mp[primes[i]]++;
}
nums.push_back(temp);
}
return nums[nums.size()-1];
}
};
Approach #2: Java.
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int[] ugly = new int[n];
int[] idx = new int[primes.length];
ugly[0] = 1;
for (int i = 1; i < n; ++i) {
ugly[i] = Integer.MAX_VALUE;
for (int j = 0; j < primes.length; ++j) {
ugly[i] = Math.min(ugly[i], primes[j] * ugly[idx[j]]);
}
for (int j = 0; j < primes.length; ++j) {
while (primes[j] * ugly[idx[j]] <= ugly[i]) idx[j]++;
}
}
return ugly[n-1];
}
}
Approach #3: Python.
class Solution(object):
def nthSuperUglyNumber(self, n, primes):
"""
:type n: int
:type primes: List[int]
:rtype: int
"""
ugly = [1] * n
i_list = [-1] * len(primes)
v_list = [1] * len(primes)
k = 0
while k < n:
x = min(v_list)
ugly[k] = x
for v in xrange(len(i_list)):
if x == v_list[v]:
i_list[v] += 1
v_list[v] = ugly[i_list[v]] * primes[v]
k += 1
return ugly[k-1]