超级丑数

编写一段程序来查找第n个超级丑数。

超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。

示例:

输入: 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] 。

说明:

  • 1 是任何给定 primes 的超级丑数。
  • 给定 primes 中的数字以升序排列。
  • 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000 。
  • 第 n 个超级丑数确保在 32 位有符整数范围内。

质数集合可以任意给定,由于我们不知道质数的个数,我们可以用一个idx数组来保存当前的位置,然后我们从每个子链中取出一个数,找出其中最小值,然后更新idx数组对应位置,注意有可能最小值不止一个,要更新所有最小值的位置可以参见题解263丑数II

 class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int[] dp = new int[n];
// 第一个超级丑数是1
dp[0] = 1;
int[] idxPrimes = new int[primes.length];
int counter = 1;
while (counter < n) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < primes.length; i++) {
// idxPrimes[i]代表每个丑数的个数,
// 比如丑数2题目的2,3,5,
// idxPrimes[0]代表2的下标
// idxPrimes[1]代表3的下标
// idxPrimes[2]代表5的下标
int temp = dp[idxPrimes[i]] * primes[i];
min = min < temp ? min : temp;
}
// 如果min和 dp[idxPrimes[i]] * primes[i]相等,
// 则其对应的下标++
for (int i = 0; i < primes.length; i++) {
if (min == dp[idxPrimes[i]] * primes[i]) {
idxPrimes[i]++;
}
}
dp[counter] = min;
counter++;
}
return dp[n - 1];
}
}

最新文章

  1. Oracle第三方ado.net数据提供程序
  2. AspNetUsers
  3. iOS开发常用的第三方类库
  4. bower的使用
  5. 播放视频最好的 HTML 解决方法
  6. 004.ASP.NET MVC中的HTML Helpers
  7. Spark RDD整理
  8. Linux命令之yes
  9. php的一些特殊用法
  10. [原]此程序专用来说明C++模板的用法
  11. 我写过的软件之FileExpert
  12. Android中GridView、ListView 的 getChildAt() 方法返回null 问题
  13. MyBatis 批量修改记录
  14. 201521123038 《Java程序设计》 第十三周学习总结
  15. React-Native 之 Modal介绍与使用
  16. OkHttp 设置 User-Agent 教程
  17. [时序图笔记] 步步为营UML建模系列五、时序图(Squence diagram)【转】
  18. Centos 7 搭建FTP详细配置步骤方法
  19. lable标签的用途
  20. php解决前后端验证字符串长度不一致

热门文章

  1. IIR型高斯滤波的原理及实现
  2. Datapatch AND What to do if the status of a datapatch action was not SUCCESS due to finding non-ignorable errors
  3. poj2282The Counting Problem(组合)
  4. AJPFX关于表结构的相关语句
  5. Ajax深入理解
  6. Oracle逻辑备份与恢复(Data Pump)
  7. java实现斐波那契的两种方法
  8. 在项目中运用精益 - Five Why
  9. 使用Jenkins进行android项目的自动构建(6)
  10. 四次元新浪微博客户端Android源码