题目
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 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]
}