美文网首页
313:超级丑数

313:超级丑数

作者: nobigogle | 来源:发表于2022-04-04 10:11 被阅读0次

题意

超级丑数是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。
给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。
题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。

用例

1

输入:n = 12, primes = [2,7,13,19]
输出:32 
解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。

2

输入:n = 1, primes = [2,3,5]
输出:1
解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。

误区

超级丑数包含的数不仅是质因数的整数倍,还会包含不同质因数之间的乘积。因此超级丑数一定是之前丑数乘以质因数得到的。

题解

使用优先队列

按照上述描述所示,首先将1压入队列,出队列的元素分别乘以质因数得到将来可能的超级丑数,因此就出现了重复数据【例如:2、7 在2出队列时候,会把14压进去,在7出队列的时候也把14压进去,因此需要去重操作】,根据题意重复数据需要去除。我们可以直接使用HashSet进行去重。

class Solution {
    public int nthSuperUglyNumber(int n, int[] primes) {
        PriorityQueue<Integer> q = new PriorityQueue<>();
        // 初始化第一个超级丑数
        q.add(1);
        while (n-- > 0) {
            int x = q.poll();
            if (n == 0) return x;
            for (int k : primes) {
               // 按照题意-》数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。
                if (k <= Integer.MAX_VALUE / x) q.add(k * x);
               // 暂时想不明白为什么这里需要根据取余去重
                if (x % k == 0) break;
            }
        }
        return -1; // never
    }
}

相关文章

  • 313:超级丑数

    题意 超级丑数是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。给你一个整数 n 和一个整数数组...

  • 313. 超级丑数

    leetcode

  • 313. 超级丑数

    编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整...

  • 313. 超级丑数

    https://leetcode-cn.com/problems/super-ugly-number/[https...

  • leetcode_313_超级丑数

    题目: 编写一段程序来查找第 n 个超级丑数。超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中...

  • 力扣(LeetCode) - 313 超级丑数

    一、题目 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes...

  • 丑数 263, 264, 313

    用一套代码解决: 263 313

  • Day81 超级丑数

    直接抄星主的: 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 pri...

  • 263、丑数(E)

    判断一个正整数是否为一个丑数。丑数的定义是 1 为丑数,只包含 2、3、5的数就是丑数,比如 4,8,但是14 就...

  • golang实现剑指offer:动态规划题型

    丑数 LeetCode 面试题49:丑数 题目描述 我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Nu...

网友评论

      本文标题:313:超级丑数

      本文链接:https://www.haomeiwen.com/subject/qqfcsrtx.html