java - 找到表达式 (2^x)*(3^y)*(5^z) 的第 K 个最小数

标签 java algorithm hamming-numbers

在表达式中

2x * 3y * 5z

xyz 可以取非负整数值(>=0)。

所以函数会生成一系列数字1,2,3,4,5,6,8,9,10,12,15,16....

  • 我有一个蛮力解决方案。
  • 我基本上会在从 1​​ 开始的循环中进行迭代,并且在每次迭代中,我会发现当前的数字因子是否仅来自 2,3 或 5 的集合。

我想要的是一个优雅的算法。

这是一道面试题。

最佳答案

这可以使用优先级队列来解决,其中存储三元组 (x, y, z) 按键 2x3 排序y5z.

  1. 仅从队列中的三元组 (0, 0, 0) 开始。

  2. 从队列中移除键最小的三元组(x, y, z)

  3. 插入三个三元组(x+1, y, z), (x, y+1, z)(x, y, z+1) 在队列中。确保您没有插入任何已经存在的内容。

  4. 从第 2 步开始重复,直到删除 k 个三元组。删除的最后一个是您的答案。

实际上,这变成了这个有向无环图的排序遍历。 (这里显示的前三个级别,实际的图形当然是无限的)。

infinite graph

关于java - 找到表达式 (2^x)*(3^y)*(5^z) 的第 K 个最小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215315/

相关文章:

java - 随机选择第k大元素

algorithm - 使用一组质数按升序生成整数

algorithm - 棘手的谷歌面试问题

algorithm - O(n) 算法,找到丢失的整数

python - 为什么我不能通过 pygtrie 在 trie 中添加单词?

algorithm - 查找只能被 2、3 和 5 整除的前 N ​​个数字的时间复杂度

java - GWT 即时编译

Java 线程生产者消费者算法无法正常工作

java - 使用 RuntimeExceptions 和 CheckedExceptions

java - ImageIO 未加载图像