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 given primes = [2,7,13,19] of size 4.

Note:

  • 1 is a super ugly number for any given primes.
  • 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];
    }

};

results matching ""

    No results matching ""