Super Ugly Number

medium heap dp math

Problem

Find the nth super ugly number whose only prime factors come from a list of primes.

Inputn = 12, primes = [2,7,13,19]
Output32
Sequence: 1,2,4,7,8,13,14,16,19,26,28,32 (index 12, 1-based).

def nth_super_ugly_number(n, primes):
    ugly = [1]
    ptr = [0] * len(primes)
    while len(ugly) < n:
        cands = [primes[i] * ugly[ptr[i]] for i in range(len(primes))]
        nxt = min(cands)
        ugly.append(nxt)
        for i in range(len(primes)):
            if cands[i] == nxt: ptr[i] += 1
    return ugly[-1]
function nthSuperUglyNumber(n, primes) {
  const ugly = [1];
  const ptr = primes.map(() => 0);
  while (ugly.length < n) {
    const cands = primes.map((p, i) => p * ugly[ptr[i]]);
    const next = Math.min(...cands);
    ugly.push(next);
    for (let i = 0; i < primes.length; i++) if (cands[i] === next) ptr[i]++;
  }
  return ugly[n - 1];
}
class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
        int[] ugly = new int[n]; ugly[0] = 1;
        int[] ptr = new int[primes.length];
        for (int k = 1; k < n; k++) {
            int next = Integer.MAX_VALUE;
            for (int i = 0; i < primes.length; i++) next = Math.min(next, primes[i] * ugly[ptr[i]]);
            ugly[k] = next;
            for (int i = 0; i < primes.length; i++) if (primes[i] * ugly[ptr[i]] == next) ptr[i]++;
        }
        return ugly[n - 1];
    }
}
int nthSuperUglyNumber(int n, vector& primes) {
    vector ugly(n, 0); ugly[0] = 1;
    vector ptr(primes.size(), 0);
    for (int k = 1; k < n; k++) {
        int next = INT_MAX;
        for (int i = 0; i < (int)primes.size(); i++) next = min(next, primes[i] * ugly[ptr[i]]);
        ugly[k] = next;
        for (int i = 0; i < (int)primes.size(); i++) if (primes[i] * ugly[ptr[i]] == next) ptr[i]++;
    }
    return ugly[n - 1];
}
Time: O(n · k) Space: O(n + k)