【Medium】518. Super Ugly Number

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. For example, [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.

Notice:

  • 1 is a super ugly number for any given primes.

  • The given numbers in primes are in ascending order.

  • 0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000

Example:

Given n = 6, primes = [2, 7, 13, 19] return 13

解题思路

测试数据并不是ascending order...所以代码按照随机order写。剪枝条件是当前数大于第K小的数,维护一个queue,每次把poll出来的数字乘以prime数组中的每个数 再加入队列,ascending下的理想状况是整体扫描趋势从小到大。

核心代码

    pq.add((long)(-1));

    for (int i = 0; i < primes.length; i++){
        queue.offer((long)primes[i]);
    }

    while (queue.size() > 0){
        long head = queue.poll();
        pq.add(-1 * head);
        for (int i = 0; i < primes.length; i++) {
            if (pq.size() > n && primes[i] * head > -1 * pq.peek()) continue;
            if (!queue.contains(primes[i] * head)) queue.offer(primes[i] * head);
        }
        while (pq.size() > n) pq.remove(pq.peek());
    }

时间空间复杂度

O(k) + S(k)

k为prime数组长度

Last updated