我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
注意:是找只包含质因子2,3,5的数,而不是找质因子只有2,3,5的数,本人就因为看错题然后思路一直错。
动态规划,状态转移方程:f[i] = min (f[a]*2,f[b]*3,f[c]*5)
f[i]代表第i-1个丑数,f[0]是第一个丑数。
难理解的点:a,b,c怎么求?
min (f[a]*2,f[b]*3,f[c]*5)表示的是大于f[i-1]的最小值,f[i-1]也就是上一个丑数,求下一个丑数f[i],则需要找到最接近f[i-1]的丑数,这是可以用a,b,c三个下标表示大于f[i-1]的最小值,a,b,c的初始值0,当更新下一个丑数时, 因为(f[a]*2,f[b]*3,f[c]*5)中的任意一个值肯定大于上一个丑数,只需要判断是否等于新增的丑数,如果等于,就让下标加1。
var nthUglyNumber = function(n) {
let a,b,c;
a=b=c=0;
let f=new Array(2000)
f[0]=1;
for(let i=1;i<n;i++){
f[i]=Math.min(f[a]*2,f[b]*3,f[c]*5);//求第i-1个丑数
//判断是否需要更新a,b,c的值
if(f[i]==f[a]*2)a++;
if(f[i]==f[b]*3)b++;
if(f[i]==f[c]*5)c++;
}
return f[n-1]//代表第n个丑数,因为f[0]是第一个丑数
};