[路飞]_丑数与超级丑数

161 阅读1分钟

264. 丑数 II

题目

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 23 和/或 5 的正整数。

示例1

输入: n = 10
输出: 12
解释: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

解题思路

动态规划

状态转移方程,找到2,3,5质数最小值放在数组中即可

代码

var nthUglyNumber = function(n) {
    let n2 = 0;
    let n3 = 0;
    let n5 = 0;
    const result = [1]
    while(result.length < n){
        const min = Math.min(result[n2]*2,result[n3]*3 ,result[n5]*5)
        if(min === result[n2]*2) n2++;
        if(min === result[n3]*3) n3++;
        if(min === result[n5]*5) n5++;
        result.push(min)
    }
    return result[n-1]
};

延伸超级丑数

超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。

给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。

题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。

思路

将质数改为质数数组,每次获取最小的数时将质数数组增加1

代码

var nthSuperUglyNumber = function (n, primes) {
  const len = primes.length
  const list = Array(len).fill(0)
  const result = [1]
  while (result.length < n) {
    let min = Infinity
    for (let i = 0; i < len; i++) {
      const t = list[i]
      min = Math.min(min, result[t] * primes[i])
    }
    for (let i = 0; i < len; i++) {
      const t = list[i]
      if (min === result[t] * primes[i]) list[i]++
    }
    result.push(min)
  }

  return result[n - 1]
}