LeetCode Solutions
313. Super Ugly Number
Time: $O(nk)$ Space: $O(k)$
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
const int k = primes.size();
vector<int> indices(k);
vector<int> uglyNums{1};
while (uglyNums.size() < n) {
vector<int> nexts(k);
for (int i = 0; i < k; ++i)
nexts[i] = uglyNums[indices[i]] * primes[i];
const int next = *min_element(begin(nexts), end(nexts));
for (int i = 0; i < k; ++i)
if (next == nexts[i])
++indices[i];
uglyNums.push_back(next);
}
return uglyNums.back();
}
};
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
final int k = primes.length;
int[] indices = new int[k];
int[] uglyNums = new int[n];
uglyNums[0] = 1;
for (int i = 1; i < n; ++i) {
int[] nexts = new int[k];
for (int j = 0; j < k; ++j)
nexts[j] = uglyNums[indices[j]] * primes[j];
final int next = Arrays.stream(nexts).min().getAsInt();
for (int j = 0; j < k; ++j)
if (next == nexts[j])
++indices[j];
uglyNums[i] = next;
}
return uglyNums[n - 1];
}
}
class Solution:
def nthSuperUglyNumber(self, n: int, primes: List[int]) -> int:
k = len(primes)
nums = [1]
indices = [0] * k
while len(nums) < n:
nexts = [0] * k
for i in range(k):
nexts[i] = nums[indices[i]] * primes[i]
next = min(nexts)
for i in range(k):
if next == nexts[i]:
indices[i] += 1
nums.append(next)
return nums[-1]