Leetcode 313: Super Ugly Number (超级丑数)

  1. Super Ugly Number
    Medium
    A super ugly number is a positive integer whose prime factors are in the array primes.
    Given an integer n and an array of integers primes, return the nth super ugly number.
    The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

Example 1:

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].

Example 2:

Input: n = 1, primes = [2,3,5]

Output: 1

Explanation: 1 has no prime factors, therefore all of its prime factors are in the array primes = [2,3,5].

Constraints:

1 <= n <= 105

1 <= primes.length <= 100

2 <= primes[i] <= 1000

primes[i] is guaranteed to be a prime number.

All the values of primes are unique and sorted in ascending order.

解法1:用Heap做。注意去重可以用topNode.product != uglys[index]。

cpp 复制代码
struct Node {
    int prime;
    int index;
    long long product;
    Node(int pri, int id, long long pro) : prime(pri), index(id), product(pro) {}
    bool operator < (const Node & node) const {
        return product >= node.product;
    }
};

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        int primesCount = primes.size();
        vector<long long> uglys(n + 1, 0);
        vector<int> indexes(primesCount, 1);
        priority_queue<Node> minHeap;
        uglys[1] = 1;
        int index = 1;
        for (int i = 0; i < primesCount; i++) {
            minHeap.push(Node(primes[i], 1, primes[i])); //1 * primes[i] = primes[i]
        }

        while (index <= n) {
            int minV = INT_MAX;
            Node topNode = minHeap.top();
            minHeap.pop();
            if (topNode.product != uglys[index]) {
                if (index < n) {
                    uglys[++index] = topNode.product;
                }
                else break;
            }
            minHeap.push(Node(topNode.prime, topNode.index + 1, uglys[topNode.index + 1] * topNode.prime));
        }
        return (int)uglys[n];
    }
};
相关推荐
2501_924952692 分钟前
C++中的枚举类高级用法
开发语言·c++·算法
2401_873204654 分钟前
代码覆盖率工具实战
开发语言·c++·算法
不染尘.7 分钟前
欧拉路径算法
开发语言·数据结构·c++·算法·图论
黎阳之光20 分钟前
黎阳之光:数智技术赋能水利“平急两用” 筑牢水利工程安全防线
大数据·人工智能·算法·安全·数字孪生
WG_1722 分钟前
Linux44+45:日志和线程池
算法
️是7836 分钟前
信息奥赛一本通—编程启蒙(3345:【例60.2】 约瑟夫问题)
开发语言·c++·算法
add45a44 分钟前
C++中的智能指针详解
开发语言·c++·算法
做科研的周师兄1 小时前
巴音河中下游灌溉草地空间分布数据集(2020年)
大数据·人工智能·算法·机器学习·数据挖掘·聚类
闻缺陷则喜何志丹1 小时前
【分治法 前缀和】P8572 [JRKSJ R6] Eltaw|普及+
c++·算法·前缀和·洛谷·分治法
纤纡.1 小时前
矿物识别分类:8 种机器学习算法对比与实战(平均值填充数据集)
python·深度学习·算法·机器学习